nditer 不是这种情况下最好的迭代工具。它在致力于编译(cython)解决方案时很有用,但在纯 Python 编码中则不然。
看一些常规的迭代策略:
In [832]: x=np.array([[1,3],[2,4]])
In [833]: x
Out[833]:
array([[1, 3],
[2, 4]])
In [834]: for i in x:print i # print each row
[1 3]
[2 4]
In [835]: for i in x.T:print i # print each column
[1 2]
[3 4]
In [836]: for i in x.ravel():print i # print values in order
1
3
2
4
In [837]: for i in x.T.ravel():print i # print values in column order
1
2
3
4
你评论:I need to fill values into an array based on the index of each cell in the array
index 是什么意思?
带有索引的粗略 2d 迭代:
In [838]: for i in range(2):
.....: for j in range(2):
.....: print (i,j),x[i,j]
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4
ndindex 使用nditer 生成相似索引
In [841]: for i,j in np.ndindex(x.shape):
.....: print (i,j),x[i,j]
.....:
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4
enumerate 是一种很好的 Python 获取值和索引的方法:
In [847]: for i,v in enumerate(x):print i,v
0 [1 3]
1 [2 4]
或者您可以使用meshgrid 将所有索引生成为数组
In [843]: I,J=np.meshgrid(range(2),range(2))
In [844]: I
Out[844]:
array([[0, 1],
[0, 1]])
In [845]: J
Out[845]:
array([[0, 0],
[1, 1]])
In [846]: x[I,J]
Out[846]:
array([[1, 2],
[3, 4]])
请注意,大多数这些迭代方法只是将您的数组视为列表列表。它们没有利用数组性质,并且与使用整个 x 的方法相比会很慢。