2013-05-17 23 views
2

對於結果矩陣中的每個位置,我不想將相應的行和列的點積存儲在自變量矩陣中,而是希望存儲元素明智的積,這將成爲向第三維擴展的向量。如何用新維度中的連接替換numpy矩陣乘法中的求和?

一個想法是將參數矩陣轉換爲向量與向量條目,然後採取他們的外部產品,但我不知道如何做到這一點。

編輯:

我計算出來之前,我看到有一個答覆。這裏是我的解決方案:

def newdot(A, B): 
    A = A.reshape((1,) + A.shape) 
    B = B.reshape((1,) + B.shape) 

    A = A.transpose(2, 1, 0) 
    B = B.transpose(1, 0, 2) 

    return A * B 

什麼我做的是拆開每行和每列一對將爲其外產品,並形成他們的兩個列表,然後得到他們的內容在並行矩陣相乘。

回答

2

這是一個有點令人費解(和難以解釋的),但是這個功能應該得到你在找什麼:

def f(m1, m2): 
    return (m2.A.T * m1.A.reshape(m1.shape[0],1,m1.shape[1])) 

m3 = m1 * m2 
m3_el = f(m1, m2) 

m3[i,j] == sum(m3_el[i,j,:]) 
m3 == m3_el.sum(2) 

的基本思想是把矩陣轉換成數組和元素做逐元素乘法。其中一個數組被重新整形,在其中間維上具有一個大小,並且數組廣播規則將該維擴展到與另一個數組的高度相匹配。

+1

你可以用'm1.A [:,None,:]'替換你的整形,這使得它更緊湊,並且(我認爲)更具可讀性。 – Jaime