2017-08-01 106 views
3

目前我使用numpy的點積(3D倍2D)

Na = (3, 2, 4) 
Nb = Na[1:] 
A = np.arange(np.prod(Na)).reshape(Na) 
b = np.arange(np.prod(Nb)).reshape(Nb) 

我想要計算:

r_ik = sum_j(A_ijk * b_jk)

r = np.empty((A.shape[0], A.shape[2]) 
for i in range(A.shape[2]): 
    r[:, i] = np.dot(A[:, :, i], b[:, i]) 

在詞:A是「的4堆矩陣「(形狀(3,2)),即3d陣列,b是」4個矢量的疊加「(形狀(3,)),即2d陣列。期望的結果是「4個矩陣向量積的堆疊」,即向量堆棧,即再次是2d陣列(整形(3,4))。

我對np.einsum和np.tensordot有深入的瞭解,但是使用這些解決方案構建的解決方案至少和我的循環解決方案一樣長且不易讀。

但我認爲應該有一個簡單的問題單線程。

回答

5

我不確定爲什麼np.einsum不適合你。這應該做的伎倆:

r = np.einsum('ijk,jk->ik', A, b) 

我認爲這是非常具有可讀性,因爲它準確地反映了你在你的問題已經給數學公式。

+0

確實有效。我很困惑的表述是「每當一個標籤被重複,它總結出來」(愛因斯坦文檔)。我只需要一個總和,但是重複「j」和「k」。因此,我只嘗試了'np.einsum('ijk,jl-> ik',A,b)' – basweber

+1

幾段進一步說'輸出'索引'允許在需要時不允許求和或強制求和'。在輸出中放入'k'將關閉它的總和,並且它只是「順其自然」。 – hpaulj