2017-10-29 213 views
1

我有一個矩陣,像numpy的矩陣乘法逐行

a = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]) 

,我希望得到一個新的矩陣,其中每個元素是一個行的矩陣產品,本身:

np.array([ 
    np.dot(np.array([a[0]]).T, np.array([a[0]])), 
    np.dot(np.array([a[1]]).T, np.array([a[1]])), 
    np.dot(np.array([a[2]]).T, np.array([a[2]])), 
    np.dot(np.array([a[3]]).T, np.array([a[3]])), 
]) 

這將是一個4x4矩陣,每個元素都有一個3x3矩陣。 之後,我可以總結0軸以獲得新的3x3矩陣。

有沒有更好的方法來實現這一點,除了使用循環?

回答

2

使用NumPy broadcasting保持第一軸線對齊,並且第二個之間進行外產品 -

a[:,:,None]*a[:,None,:] # or a[...,None]*a[:,None] 

隨着np.einsum,翻譯過來就是 -

np.einsum('ij,ik->ijk',a,a) 
+0

如果你看到我刪除的答案,我在那裏一半!下次我會做對,謝謝你的回答。 :) –

+1

@cᴏʟᴅsᴘᴇᴇᴅ是的,你很近! :) – Divakar

+0

非常感謝!我試過了,這正是我想要的。永遠不要想象廣播可以這樣完成。 – JQK

0

我可能失去了一些東西,但不是這只是矩陣乘法?

>>> a.T @ a 
array([[30, 40, 50], 
     [40, 54, 68], 
     [50, 68, 86]]) 

>>> np.sum(np.array([ 
     np.dot(np.array([a[0]]).T, np.array([a[0]])), 
     np.dot(np.array([a[1]]).T, np.array([a[1]])), 
     np.dot(np.array([a[2]]).T, np.array([a[2]])), 
     np.dot(np.array([a[3]]).T, np.array([a[3]])), 
    ]), axis=0) 
array([[30, 40, 50], 
     [40, 54, 68], 
     [50, 68, 86]]) 
+0

嗨percusse,感謝您的評論,但不,他們是不一樣的。我正在計算類似[1,2,3]的東西.T * [1,2,3] = [[1,2,3],[2,4,6],[3,6,9]],但是你正在計算的是[1,2,3] * [1,2,3] .T = [14]。 – JQK

+0

@JQK我剛剛複製你的代碼並比較結果。 – percusse

+0

是的,你似乎是正確的,但我沒有時間檢查它..謝謝你的幫助。 – JQK