2017-05-08 98 views
0

我在尋找一種更快,也可能更精確的方式來計算以下內容:
我有一個矩陣A,我想計算A的行方向點積。赫比我要計算A .T * A ,其中指數i表示矩陣A的第i行Row.T *矩陣的行點積

import numpy as np 
A=np.arange(40).reshape(20,2) 
sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)] 

這導致形狀的矩陣np.shape(sol) #=(20,2,2)
我已經有了一看在np.einsum,但不能使它工作到目前爲止。
如果只存在解決方案,其中所有20個2×2矩陣相加,這也沒關係,因爲我無論如何要總結一下到底:)

感謝

+0

什麼是必須從輸出的形狀 - '「全部20個2×2矩陣相加」'? – Divakar

+0

對不起。總和我的意思是對所有20個2x2矩陣求和,得到一個2x2矩陣。在範圍(20)中對ii進行重新塑造(np.sum(np.dot(A [ii,:]。reshape(1,2).T,A [ii,:]。reshape(1,2))) ]' – Koanashi

+0

請檢查我的帖子中的編輯。另外,你的評論中的代碼是:'sol = [np.sum(...')不起作用。在發佈之前用你給定的示例驗證代碼是很好的。 – Divakar

回答

2

使用np.dot -

A.T.dot(A) 

使用np.einsum -

np.einsum('ij,ik->jk',A,A) 

採樣運行 -

>>> A=np.arange(40).reshape(20,2) 
>>> sol=[np.dot(A[ii,:].reshape(1,2).T,A[ii,:].reshape(1,2)) for ii in range(20)] 
>>> sol = np.array(sol) 
>>> sol.sum(0) 
array([[ 9880, 10260], 
     [10260, 10660]]) 
>>> A.T.dot(A) 
array([[ 9880, 10260], 
     [10260, 10660]]) 
>>> np.einsum('ij,ik->jk',A,A) 
array([[ 9880, 10260], 
     [10260, 10660]]) 

如果結果必須是20元素的數組,我認爲你需要 -

np.einsum('ij,ik->i',A,A) 
+0

非常好,非常感謝。我今天學到了東西:) – Koanashi