是否有函数在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)的函数来自动完成这项工作。
因此,可以很容易地迭代第一个维度,如您所示。对任意维度执行此操作的另一种方法是使用numpy.rollaxis()将给定维度带到第一个维度(默认行为),然后使用返回的数组(这是一个视图,因此速度很快)作为迭代器。
编辑:我将评论我向numpy提交了一个PR来解决这个问题:https://github.com/numpy/numpy/pull/3262。有人认为这不足以增加numpy代码库。我认为使用np.rollaxis是最好的方法,如果你想要一个interator,就用iter()把它包起来。
我会用以下方法:
函数rollaxis在数组上创建一个新视图。在本例中,它将轴2移动到前面,相当于操作
c.transpose(2, 0, 1)
。你的建议很快,但清晰的形式可以提高可读性:
或者,更好(更快、更普遍、更明确):
然而,上面第一种方法的速度似乎是
swapaxes()
方法的两倍:我想这是因为
swapaxes()
不复制任何数据,而且c[:,:,i]
的处理可以通过通用代码完成(处理:
被更复杂的片段替换的情况)。但是请注意,更明确的第二个解决方案
c[...,i]
既清晰又快速:相关问题 更多 >
编程相关推荐