是否有更可读(和更有效)的方法来迭代ndarray?

时间:2013-04-20 23:37:41

标签: python arrays numpy

有很多方法可以迭代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 way of iterating over 3D array

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

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.nditernp.enumerate

1 个答案:

答案 0 :(得分:1)

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

for e in arr.flat:
    dosomething(e)

当然,它比所有替代品都快。但是,如果你想要一些带索引的时髦的东西,这个方法就无法使用(使用ndenumerate - 你的链接SO答案 - 为此)。这可以与N-dims一起使用。