2015-05-01 107 views
3

我有以下兩個數組與形狀:矩陣乘法與numpy.einsum

A = (d,w,l) 
    B = (d,q) 

而且我想用這些形狀組合成一個3D陣列:

C = (q,w,l) 

要多一點具體來說,在我的情況下,d(3D陣列的深度)是2,並且我首先想要在A的上層(因此d = 0)中將w * 1中的所有位置乘以B的第一個值最高行(所以d = 0,q = 0)。對於d = 1 I做的一樣,再總結兩個這樣:

C_{q=0,w,l} = A_{d=0,w,l}*B_{d=0,q=0} + A_{d=1,w,l}*B_{d=1,q=0} 

我想通過利用numpy.einsum來計算℃。我想到了以下代碼:

A = np.arange(100).reshape(2,10,5) 

    B = np.arange(18).reshape(2,9) 

    C = np.einsum('ijk,i -> mjk',A,B) 

其中ijk指2,10,5,mjk指9,10,5。但是我得到一個錯誤。有沒有辦法用numpy einsum來執行這種乘法?

感謝

+2

快速的問題:你是從你的標串缺少'M' 。它應該是'np.einsum('ijk,im - > mjk',A,B)'?這會創建一個新的數組 - 這是你在找什麼? –

+0

感謝您的回答,但如果我這樣做,我會得到以下錯誤: 操作數無法與重新映射的形狀一起廣播[原始 - >重新映射]:(2,10,5) - >(10,5,2) (9,2) - >(2,newaxis,newaxis,9) –

+2

當我運行你的'我想到下面的代碼',但改變''ijk,我 - > mjk''爲''ijk,im - > mjk''(如@ajcr建議)我沒有收到錯誤。 – farenorth

回答

4

你的形狀A = (d,w,l), B = (d,q), C = (q,w,l)實際上寫einsum表達

C=np.einsum('dwl,dq->qwl',A,B) 

,我可以測試

In [457]: np.allclose(A[0,:,:]*B[0,0]+A[1,:,:]*B[1,0],C[0,:,:]) 
Out[457]: True