循环遍历ndarray的所有元素

The*_*tor 2 python for-loop numpy

In [6]: a = np.array([[1,2,3,4],[5,6,7,8]])

In [7]: b = a

In [8]: a[0]
Out[8]: array([1, 2, 3, 4])

In [9]: a[0][0]
Out[9]: 1
Run Code Online (Sandbox Code Playgroud)

但是我想使用zip和循环a,b然后a[0][0]跟着,a[0][1]直到我到达a[1][3].

当我尝试以下内容时:

In [11]: for i,j in zip(a,b):
    ...:     print i[0][0]
    ...:     
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-11-8a9c71fab781> in <module>()
      1 for i,j in zip(a,b):
----> 2     print i[0][0]
      3 

IndexError: invalid index to scalar variable.
Run Code Online (Sandbox Code Playgroud)

我想获得a[0][0] = 1,随后a[0][1] = 2a[0][3] = 4,然后得到a[1][0] = 5等达a[1][3] = 8.

iva*_*eev 5

如果你需要a逐个循环遍历所有元素,那ndarray.flat就是:

In [11]: a = np.array([[1,2,3,4],[5,6,7,8]])

In [13]: for i in a.flat: print(i)
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)

循环a.flatten()将产生相同的结果,但它将构造一个单独的ndarray并复制数据.

.flat也比itertools.chain.from_iterable(a)后者更有效,因为后者涉及从a视图中获取完整行,然后迭代它们 - 即许多额外操作.


如果您需要知道指数在迭代,用numpy.ndenumerate而不是按照迭代一个numpy的数组:

In [34]: for (x,y),i in np.ndenumerate(a): print("a[%d][%d]=%d"%(x,y,i))
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[0][3]=4
a[1][0]=5
a[1][1]=6
a[1][2]=7
a[1][3]=8
Run Code Online (Sandbox Code Playgroud)