2017-02-01 7 views
2

私はここで、3D私は IJKメートル IJM * B IMK)要素ABとABアレイを作成するnumpyのndarray乗算

A=np.array([[[1, 1], 
      [1, 1], 
      [1, 1]], 

      [[2, 2], 
      [2, 2], 
      [2, 2]]]) 

B=np.array([[[ 2, 0], 
      [ 0, 2]], 

      [[ 2, -2], 
      [-2, 2]]]) 

ndarray numpyの2持っています総和はm-指数(繰り返し)を超え、iを超えてはならない(それが繰り返される)。

言い換えれば、私はループ

for i in range(2): 
    AB[i,:,:]=np.dot(A[i,:,:],B[i,:,:]) 

のためにこれをディABのndarrayを得ることができ、ABは

array([[[ 2., 2.], 
    [ 2., 2.], 
    [ 2., 2.]], 

    [[ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]]) 

に等しいforループを回避する方法はありますか?どのようにしてテンソルードまたはエインサムでABアレイを得ることができますか?

ありがとう、本当にありがとうございます。

答えて

1

ABijk=∑m (Aijm*Bimk)は、私はそれが、無料手荷物に沿って休息を運んで、最後の2次元の通常dotがかかるためmatmulオペレータはまた、この

AB = A @ B 

を処理すると思い

AB = np.einsum('ijm,imk->ijk', A, B) 

に変換します。

これらをテストし、動作するかどうか教えてください。十分に最近のnumpyの(1.10+)で

+0

確認済み、両方とも動作します – musine

3

(あなたはまた、Pythonのを3.5+持っている場合)、あなたは

AB = np.matmul(A, B) 

かの操作を行うことができます

AB = A @ B 

をあなたがnumpyの1.10を持っていない場合+、行うことができます

AB = np.einsum('ijm,imk->ijk', A, B) 

大きなJ/M/Kディメンションの場合、特にBLASが良い場合は、expl forループはdotでループします。 BLAS行列の乗算は、解釈されるPythonが多く失われたときのオーバーヘッドよりも時間を節約することができます。私はnp.matmul@は同じものを利用すると思われますdotしかし、私はnp.einsumとは思わない。

+0

確認済み:「einsum」はまだBLASを使用していません。 – Daniel