(在本文中,让np
是numpy
的简写。)
假设a
是一个(n+k)维np.ndarray
对象,对于一些整数n>;1和k>;1。(如下,n+k>;3是a.ndim
的值)。我想在第一个n维度上枚举a
;这意味着,在每次迭代中,枚举器/迭代器生成一对元素,其第一个元素是索引为n的元组ii
,第二个元素是位于a[ii]
的k多维子ndarray
。在
当然,编写一个函数来实现这一点并不困难(事实上,我在下面给出了这样一个函数的例子),但我想知道:
does
numpy
provide any special syntax or functions for carrying out this type of "partial" enumeration?
(通常,当我想迭代多维np.ndarray
对象时,我使用np.ndenumerate
,但在这里没有帮助,因为(据我所知,np.ndenumerate
将迭代所有n+k维度。)
假设上述问题的答案是肯定的,那么接下来就是:
what about the case where the n dimensions to iterate over are not contiguous?
(在这种情况下,枚举器/迭代器在每次迭代时返回的对的第一个元素将是r>;n元素的元组,其中一些元素将是表示“all”的特殊值,例如slice(None)
;这对元素对的第二个元素仍然是长度为k的ndarray
)
谢谢!在
下面的代码希望能澄清问题说明。函数partial_enumerate
使用任何特殊的numpy
构造来完成我想做的事情。在partial_enumerate
的定义之后,是一个简单的例子,适用于n=k=2。在
import numpy as np
import itertools as it
def partial_enumerate(nda, n):
"""Enumerate over the first N dimensions of the numpy.ndarray NDA.
Returns an iterator of pairs. The first element of each pair is a tuple
of N integers, corresponding to a partial index I into NDA; the second element
is the subarray of NDA at I.
"""
# ERROR CHECKING & HANDLING OMITTED
for ii in it.product(*[range(d) for d in nda.shape[:n]]):
yield ii, nda[ii]
a = np.zeros((2, 3, 4, 5))
for ii, vv in partial_enumerate(a, 2):
print ii, vv.shape
输出的每一行都是一个“元组对”,其中第一个元组表示a
中的一组部分n坐标,第二个元组表示{
相反,在这种情况下,迭代np.ndenumerate(a)
将导致a.size
迭代,每个迭代访问{
我想你在找
numpy
中的函数ndindex。只需从您想要的子阵列中取一片:这将产生预期结果:
^{pr2}$可以使用numpy广播规则生成笛卡尔积。
numpy.ix_
函数创建适当数组的列表。相当于:或者,更简洁地说:
^{pr2}$结果是可广播数组的列表:
将此结果与
numpy.ogrid
的结果进行比较:如您所见,它是相同的,但是
numpy.ix_
允许您使用非连续索引。现在,当我们应用numpy广播规则时,我们得到一个笛卡尔积:如果不是将
numpy.ix_
的结果传递给numpy.broadcast
,而是用它来索引一个数组,我们得到:但是,提醒清空者。可广播数组对于索引非常有用,但是如果您确实想枚举值,则最好使用
itertools.product
:因此,如果您要合并for循环,那么
itertools.product
可能会更快。不过,您可以使用上述方法在纯numpy中获得一些类似的数据结构:相关问题 更多 >
编程相关推荐