2017-08-29 80 views
1

我有2個陣列xy分別具有形狀(2, 3, 3)(3, 3)。我想計算的點積z與形狀(2, 3)通過以下方式:2D和3D numpy陣列之間的點積

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]]) 

如何做到這一點的量化方式的任何想法?

+0

'x'看起來像'(2,3,3)'我。你能再檢查一次嗎? – Divakar

+0

這是正確的 - 我的不好。感謝您的解決方案Divakar! – Tim

+0

編輯問題以反映正確的形狀。 – Divakar

回答

1

在問題中顯示的總和減少量上,看起來減少沿着最後一個軸,同時保持第二個軸x與第一個軸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