9

私はこのようなことをしたい:

a =  # multi-dimensional numpy array
ares = # multi-dim array, same shape as a
a.shape
>>> (45, 72, 37, 24)  # the relevant point is that all dimension are different
v = # 1D numpy array, i.e. a vector
v.shape
>>> (37)  # note that v has the same length as the 3rd dimension of a
for i in range(37):
    ares[:,:,i,:] = a[:,:,i,:]*v[i]

numpyでこれを行うには、もっとコンパクトな方法が必要だと思っていますが、まだわかりません。v を複製してから を計算できると思いa*vますが、それよりも優れたものがあると推測しています。したがって、いわば「特定の軸上で」要素ごとの乗算を行う必要があります。どうすればこれができるか知っている人はいますか?ありがとう。(ところで、私は密接に重複した質問を見つけましたが、そこでのOPの特定の問題の性質のために、議論は非常に短く、他の問題に追跡されました。)

4

4 に答える 4

5

numpy のeinsum関数を使用してアインシュタイン総和表記でこれを行うことができます。

ares = np.einsum('ijkl,k->ijkl', a, v)
于 2013-10-15T18:21:54.447 に答える
5

配列の最も外側の軸に対してベクトルを自動的にブロードキャストできます。したがって、配列を転置して、必要な軸を外側にスワップし、乗算してから転置して元に戻すことができます。

ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)
于 2013-10-15T18:18:36.130 に答える
5

ここにもう1つあります:

b = a * v.reshape(-1, 1)

私見、これは よりも読みやすく、おそらく よりも読みやすいですがtransposeeinsumあなたv[:, None]のスタイルに合ったものを選んでください.

于 2013-10-15T18:24:07.943 に答える
4

私は次のようなことをする傾向があります

b = a * v[None, None, :, None]

np.newaxisの代わりに正式に書くことになっていると思いますNone

例えば:

>>> import numpy as np
>>> a0 = np.random.random((45,72,37,24))
>>> a = a0.copy()
>>> v = np.random.random(37)
>>> for i in range(len(v)):
...     a[:,:,i,:] *= v[i]
...     
>>> b = a0 * v[None,None,:,None]
>>> 
>>> np.allclose(a,b)
True
于 2013-10-15T18:22:07.963 に答える