2

これは非常に単純な質問であり、Python で迅速かつ明確な回避策があるかどうか疑問に思っています。

次のように定義された nd-array があるとします。

In [10]: C = np.random.rand(2,3,3)

In [11]: C
Out[11]: 
array([[[ 0.43588471,  0.06600133,  0.81145749],
        [ 0.20270693,  0.85879686,  0.75778422],
        [ 0.68253449,  0.98287412,  0.63804605]],

       [[ 0.61591433,  0.36453861,  0.23798795],
        [ 0.26761896,  0.00657165,  0.04083067],
        [ 0.11177481,  0.55245769,  0.97274592]]])

次に、次のように、3 次元の配列内の値と前の値の差を計算します。

In [12]: C[:, :, 1:] = C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]

In [13]: C
Out[13]: 
array([[[ 0.43588471, -0.36988337,  0.74545616],
        [ 0.20270693,  0.65608994, -0.10101264],
        [ 0.68253449,  0.30033963, -0.34482807]],

       [[ 0.61591433, -0.25137572, -0.12655065],
        [ 0.26761896, -0.26104731,  0.03425902],
        [ 0.11177481,  0.44068288,  0.42028823]]])

同様の手法を使用して元の値に戻すことは可能ですか、それとも for ループと一時変数を使用する必要がありますか?

たとえば、これはうまくいきません。

In [15]: C[:, :, 1:] = C[:, :, 0:C.shape[2]-1] + C[:, :, 1:]

In [16]: C
Out[16]: 
array([[[ 0.43588471,  0.06600133,  0.37557278],
        [ 0.20270693,  0.85879686,  0.5550773 ],
        [ 0.68253449,  0.98287412, -0.04448843]],

       [[ 0.61591433,  0.36453861, -0.37792638],
        [ 0.26761896,  0.00657165, -0.22678829],
        [ 0.11177481,  0.55245769,  0.86097111]]])
4

1 に答える 1

6

まず、違いを計算するには、代わりに

C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]

numpy.diffを使用できます:

np.diff(C, axis = -1)

In [27]: C = np.random.rand(2,3,3)

In [28]: D = C[:, :, 1:] - C[:, :, 0:C.shape[2]-1]

In [29]: E = np.diff(C, axis = -1)

In [30]: np.allclose(D, E)
Out[30]: True

次に、元の を取得したいことがわかっている場合は、そもそもC値を上書きしない方がよいかもしれません。違いを別の配列に保存するだけです:

E = np.diff(C, axis = -1)

結局のところ、計算をまったく実行しないよりも速く計算を実行する方法はありません :)。

ただし、本当に値を上書きしたい場合は、元の値を取得するためにnp.cumsumを使用します。

In [20]: C = np.random.rand(2,3,3)

In [21]: D = C.copy()

In [22]: C[:, :, 1:] = np.diff(C, axis = -1)

In [23]: C = np.cumsum(C, axis = -1)

In [24]: np.allclose(C,D)
Out[24]: True
于 2013-01-28T19:16:57.840 に答える