我试图了解如何使用 nditer 进行缩减,在我的情况下将 3d 数组转换为 2d 数组。
我按照这里的帮助 http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html并设法创建了一个在输入的最后一个轴上应用归约的函数。有了这个功能
def nditer_sum(data, red_axes):
it = numpy.nditer([data, None],
flags=['reduce_ok', 'external_loop'],
op_flags=[['readonly'], ['readwrite', 'allocate']],
op_axes=[None, red_axes])
it.operands[1][...] = 0
for x, y in it:
y[...] = x.sum()
return it.operands[1]
我可以得到相当于 data.sum(axis=2) 的东西
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> nditer_sum(data, [0, 1, -1])
[[ 6 22 38]
[54 70 86]]
>>> data.sum(axis=2)
[[ 6 22 38]
[54 70 86]]
因此,要获得与 data.sum(axis=0) 等效的内容,尽管将参数 red_axes 更改为 [-1, 0,1] 就足够了,但结果却大不相同。
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> data.sum(axis=0)
[[12 14 16 18]
[20 22 24 26]
[28 30 32 34]]
>>> nditer_sum(data, [-1, 0, 1])
[[210 210 210 210]
[210 210 210 210]
[210 210 210 210]]
在 nditer_sum (for x,y in it:) 内部的 for 循环中,迭代器循环 2 次,每次给出一个长度为 12 的数组,而不是循环 12 次,每次给出一个长度为 2 的数组。我已经多次阅读了 numpy 文档,并在谷歌上对此无济于事。我正在使用 numpy 1.6 和 python 2.7