我正在学习numpy,我遇到了一个使用np.nditer
的例子:
a = np.arange(6).reshape(2, 3)
for i in np.nditer(a):
print i,
打印出来:
0 1 2 3 4 5
每个元素的内存索引。给定这些索引,如何访问numpy数组中的每个元素?只是做a[i]
会产生错误,因为数组的维度超过1维。
答案 0 :(得分:2)
nditer
返回数组的元素,作为0d数组本身。您必须使用额外的参数来获取(多)索引。
如果我进行迭代,但显示i
除了它的值之外的信息,你会看到:
In [132]: a = np.arange(6).reshape(2,3)
In [134]: for i in np.nditer(a):
...: print(i, type(i), i.shape, i.dtype)
0 <class 'numpy.ndarray'> () int32
1 <class 'numpy.ndarray'> () int32
2 <class 'numpy.ndarray'> () int32
3 <class 'numpy.ndarray'> () int32
4 <class 'numpy.ndarray'> () int32
5 <class 'numpy.ndarray'> () int32
或等效地,使用repr
显示:
In [135]: for i in np.nditer(a):
...: print(repr(i))
...:
array(0)
array(1)
...
np.nditer
不是一个非常有用的迭代机制,尤其不是在开头。它最好被视为在高级cython
代码中使用它的踏脚石。换句话说,研究https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html,一直到最后。
看起来您的示例来自此页面。
使用nditer可以完成的最基本任务是访问数组的每个元素。每个元素都是使用标准的Python迭代器接口逐个提供的。
有更多直接的方法来迭代数组:
In [136]: for i in a: print(repr(i)) # by rows
array([0, 1, 2])
array([3, 4, 5])
In [139]: for ij in np.ndenumerate(a): # with value and 2d index
...: print(ij)
((0, 0), 0)
((0, 1), 1)
((0, 2), 2)
((1, 0), 3)
((1, 1), 4)
((1, 2), 5)
multi_index
页面上的nditer
示例提供了类似的信息:
In [141]: it = np.nditer(a, flags=['multi_index'])
...: while not it.finished:
...: print("%d <%s>" % (it[0], it.multi_index))
...: it.iternext()
...:
0 <(0, 0)>
1 <(0, 1)>
2 <(0, 2)>
3 <(1, 0)>
4 <(1, 1)>
5 <(1, 2)>