2

有很多方法可以遍历 2D 数组。下面的例子。

这些方法中的大多数,虽然很实用,但让我觉得难以阅读。有些非常消耗内存,并且大多数不能很好地推广到 N 维。

有没有一种更易读的方法,最好是一种计算效率高并且很好地推广到 ND 的方法来迭代 ndarray 中的所有坐标集?

arr = np.arange(100).reshape([10,10])
x,y = np.indices(arr.shape)

for i,j in zip(x.flat,y.flat):
    dosomething(arr[i,j])

for i,j in np.nditer(np.indices(arr.shape).tolist()):
    dosomething(arr[i,j])

for i in xrange(arr.shape[0]):
    for j in xrange(arr.shape[1]):
        dosomething(arr[i,j])

for i,j in itertools.product(range(arr.shape[0], range.shape[1])):
    dosomething(arr[i,j])

# on further thought, maybe this one is OK?
for ind in xrange(arr.size):
    i,j = np.unravel_index(ind, arr.shape)
    dosomething(arr[i,j])

for i,j in itertools.product(*map(xrange, arr.shape)):
    dosomething(arr[i,j])

(后者来自Pythonic 迭代 3D 数组的方式

我真正想要回答的问题是“我如何获得数组的x,索引?” y答案是:

for i,j in (np.unravel_index(ind,arr.shape) for ind in xrange(arr.size)):
    dosomething(arr[i,j])

(np.unravel_index(ind,arr.shape) for ind in xrange(arr.size))是一个相当易读和高效的生成器。

但是,对于标题中提出的问题,其他(链接的)答案更好(np.nditer, np.enumerate

4

1 回答 1

1

从您的示例中,您似乎想以 C 连续样式迭代您的数组。如果您只关心元素而不关心索引,则可以使用以下内容:

for e in arr.flat:
    dosomething(e)

当然,它比所有替代方案都快。但是,如果您想使用索引进行一些时髦的事情,则不能使用此方法(为此使用ndenumerate - 您的链接 SO 答案)。这可以与 N-dims 一起使用。

于 2013-04-21T14:45:40.143 回答