【发布时间】:2012-09-30 17:05:48
【问题描述】:
我正在尝试了解如何与 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 :),迭代器是 循环 2 次并每次给出一个长度为 12 的数组,而不是 循环 12 次,每次给出一个长度为 2 的数组。我有 多次阅读 numpy 文档并在 Google 上搜索到 徒劳无功。我正在使用 numpy 1.6 和 python 2.7
【问题讨论】:
-
-1 in op_axes 被记录为“新轴”,这是你想要做的吗?文档也将 [[size x]、[size y]、[size z]] 输入 op_axes,而您推送 [None, [size 3]],这是有意的吗?
-
documentation 说“操作数是从迭代器的维度到操作数的维度的映射”......不管这意味着什么。在当前示例中,我复制了iterating over arrays tutorial 中的代码,该代码有效,但仅适用于最后一个轴。在示例中,3d 数组的 op_axes None (这似乎相当于 [-1, -1, -1])和 2d 轴有 [0, 1, -1]
-
我虽然将 [0,1,-1] 更改为 [-1, 0, 1] 会减少第一个轴,但它不起作用。我的问题是如何在任意轴上进行缩减。
-
把这个问题发给开发者然后回到这里?我也想知道。