是否有函数可以在numpy数组的任意维度上获得迭代器?

在第一维上迭代很容易...

In [63]: c = numpy.arange(24).reshape(2,3,4)

In [64]: for r in c :
   ....:     print r
   ....:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]

但是,要遍历其他维度很难。例如,最后一个维度:
In [73]: for r in c.swapaxes(2,0).swapaxes(1,2) :
   ....:     print r
   ....:
[[ 0  4  8]
 [12 16 20]]
[[ 1  5  9]
 [13 17 21]]
[[ 2  6 10]
 [14 18 22]]
[[ 3  7 11]
 [15 19 23]]

我正在自己生成一个发生器来执行此操作,但令我惊讶的是,没有像numpy.ndarray.iterdim(axis = 0)这样的函数可以自动执行此操作。

最佳答案

您提出的建议相当快,但是可以通过以下更清晰的形式来提高可读性:

for i in range(c.shape[-1]):
    print c[:,:,i]

或者更好(更快,更通用,更明确):
for i in range(c.shape[-1]):
    print c[...,i]

但是,上述第一种方法的速度似乎是swapaxes()方法的两倍:
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for r in c.swapaxes(2,0).swapaxes(1,2): u = r'
100000 loops, best of 3: 3.69 usec per loop

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for i in range(c.shape[-1]): u = c[:,:,i]'
100000 loops, best of 3: 6.08 usec per loop

python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for r in numpy.rollaxis(c, 2): u = r'
100000 loops, best of 3: 6.46 usec per loop

我猜这是因为swapaxes()不复制任何数据,并且因为c[:,:,i]的处理可能是通过通用代码完成的(该代码处理了:被更复杂的切片替换的情况)。

但是请注意,更明确的第二个解决方案c[...,i]既清晰又快速:
python -m timeit -s 'import numpy; c = numpy.arange(24).reshape(2,3,4)' \
    'for i in range(c.shape[-1]): u = c[...,i]'
100000 loops, best of 3: 4.74 usec per loop

关于python - 遍历numpy.array的任意维度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1589706/

10-12 23:19