有很多方法可以遍历 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
)