NumPy:使用nditer迭代numpy数组的外部维度

时间:2017-03-25 15:56:19

标签: python numpy multidimensional-array

我无法迭代numpy数组的外轴。

import numpy as np

a = np.arange(2*3).reshape(2,3)
it = np.nditer(a)
for i in it:
    print i

这就像人们所期望的那样:

0
1
2
3
4
5
然而,我会像输出一样三分,这样我就在外轴上迭代了:

(0, 1, 2)
(3, 4, 5)

我知道有很多方法可以实现这一目标,但在倾注nditer documentation之后,我似乎找不到使用nditer的解决方案。我用它作为学习nditer的机会。所以我宁愿不使用其他解决方案,除非它真的更高效或pythonic。

2 个答案:

答案 0 :(得分:2)

使用普通for

更容易控制迭代
In [17]: a
Out[17]: 
array([[0, 1, 2],
       [3, 4, 5]])
In [18]: for row in a:
    ...:     print(row)
    ...:     
[0 1 2]
[3 4 5]

使用nditer执行此操作显然很尴尬。除非您需要按照页面末尾所述的广播使用cython,否则nditer不会提供任何速度优势。即使使用cython,我memoryviews的速度也比nditer更快。

看看np.ndindex。它创建了一个尺寸减小的虚拟数组,并对其进行了编写:

In [20]: for i in np.ndindex(a.shape[0]):
    ...:     print(a[i,:])
    ...:     
[[0 1 2]]
[[3 4 5]]

知道了:

In [31]: for x in np.nditer(a.T.copy(), flags=['external_loop'], order='F'):
    ...:     print(x)

[0 1 2]
[3 4 5]
像我说的那样 - 尴尬

我最近探讨了直接迭代和nditer在1d结构化数组上的区别:https://stackoverflow.com/a/43005985/901925

答案 1 :(得分:0)

您可以迭代它,就像迭代一维数组以获得您想要的输出一样。

 for k,v in enumerate(a):
      print(v)