2012-11-20 34 views
1

行中numpy的:numpy的點積與第i列

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

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

A.dot(B) 
array([[35, 44], 
     [44, 56]]) 

我只關心越來越A.dot(B).diagonal()=陣列(〔35,56])

有沒有一種方法可以得到數組([35,56])而不必計算所有行和列的內積?即第i行與第i列的內積。我問,因爲性能上的差異變得較大矩陣更顯著...

感謝

回答

2

這僅僅是矩陣乘法的二維數組:

C[i, j] = sum(A[i, ] * B[, j]) 

那麼既然你只是想對角線元素,看起來你是後

sum(A[i, ] * B[, i]) # for each i 

所以你可以只使用列表理解:

[np.dot(A[i,:], B[:, i]) for i in xrange(A.shape[0])] 
# [22, 64] 

或,(這隻適用於因爲你想diagonal所以這個假設,如果A的尺寸爲n x m,B的尺寸將m x n):

np.sum(A * B.T, axis=1) 
# array([22, 64]) 

(沒有花哨的招數numpy的事情在這裏,只需用數學玩耍)。

+0

再次感謝......所以它不像http://stackoverflow.com/questions/2301046/compute-only-diagonals- in-matrix-product-in-octave :( – ejang

+0

那麼,如果你發現這個問題,你可以直接把它翻譯成numpy(我發佈答案並將其添加到我的答案時,我就想到了完全相同的東西) –

0

你可以簡單地離開了你不關心參數的行?

2x3 x 3x2爲您提供2x2結果。

1x3 x 3x2矩陣將只給出[A] [B](1x2矩陣)的第一行。

編輯:誤讀了這個問題。儘管如此,矩陣中的每個值都是由列和行的轉置產生的。

+0

對不起,我意識到我實際上是在尋找對角線,而不是第一行 – ejang