10

私の場合、3次元配列を2次元配列に変換して、削減を行うためにnditerを操作する方法を理解しようとしています。

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 ループ (for x,y in it:) では、反復子は 2 回ループし、毎回長さ 2 の配列を 12 回ループして与えるのではなく、長さ 12 の配列を与えます。私はnumpyのドキュメントを数回読んで、これについてグーグルで調べましたが役に立ちませんでした。私はnumpy 1.6とpython 2.7を使用しています

4

2 に答える 2

0

y[...] = x.sum()行を変更してy[...] += x修正します(例のようにここ)。

于 2012-11-12T19:43:09.847 に答える