如何使用内存索引访问numpy数组?

时间:2017-03-07 01:04:35

标签: python numpy

我正在学习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维。

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)>