2017-08-29 6 views
1

I 2つのアレイxそれぞれ形状(2, 3, 3)y(3, 3)を有します。ドット積

x = np.array([[[a111, a121, a131], [a211, a221, a231], [a311, a321, a331]], 
       [[a112, a122, a132], [a212, a222, a232], [a312, a322, a332]]]) 
y = np.array([[b11, b12, b13], [b21, b22, b23], [b31, b32, b33]]) 
z = np.array([[a111*b11+a121*b12+a131*b13, a211*b21+a221*b22+a231*b23, a311*b31+a321*b32+a331*b33], 
[a112*b11+a122*b12+a132*b13, a212*b21+a222*b22+a232*b23, a312*b31+a322*b32+a332*b33]]) 

ベクトル化の方法でこれを行う方法上の任意のアイデアを:私は、次のように形状(2, 3)と内積zを計算したいですか?

+0

は 'X'は、私には、 '(2,3,3)'のように見えます。もう一度確認できますか? – Divakar

+0

それは正しい - 私の悪い。あなたのソリューションDivakarに感謝します! – Tim

+0

正しい形状を反映するように編集された質問。 – Divakar

答えて

1

質問に表示された合計減算では、第2軸の軸がxで、第1軸の軸がyの軸に一致していることがわかります。この軸合わせの要件のために、np.einsumを使用することができます。従って、一つのベクトル化ソリューションは次のようになります -

np.einsum('ijk,jk->ij',x, y) 

サンプル実行 -

In [255]: x 
Out[255]: 
array([[[5, 1, 7], 
     [2, 1, 7], 
     [5, 1, 2]], 

     [[6, 4, 7], 
     [3, 8, 1], 
     [1, 7, 7]]]) 

In [256]: y 
Out[256]: 
array([[5, 4, 7], 
     [8, 2, 5], 
     [2, 3, 3]]) 

In [260]: np.einsum('ijk,jk->ij',x, y) 
Out[260]: 
array([[78, 53, 19], 
     [95, 45, 44]]) 

In [261]: 5*5 + 1*4 + 7*7 
Out[261]: 78 

In [262]: 2*8 + 1*2 + 7*5 
Out[262]: 53