有很多方法可以迭代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)
我真正想要回答的问题是“我如何获得数组的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
)
答案 0 :(得分:1)
从您的示例中,您似乎希望以C-contiguous样式迭代数组。如果您只关心元素而不关注索引,可以使用以下内容:
for e in arr.flat:
dosomething(e)
当然,它比所有替代品都快。但是,如果你想要一些带索引的时髦的东西,这个方法就无法使用(使用ndenumerate - 你的链接SO答案 - 为此)。这可以与N-dims一起使用。