2016-02-14 140 views
6

對不起,解釋不好的標題。我試圖平行化我的代碼的一部分,並卡住了點積。我在找做下面的代碼呢,我敢肯定什麼有一個簡單的線性代數解的一個有效的方式,但我很卡:Numpy Dot產品的兩個二維陣列在numpy獲得三維陣列

puy = np.arange(8).reshape(2,4) 
puy2 = np.arange(12).reshape(3,4) 

print puy, '\n' 
print puy2.T 

zz = np.zeros([4,2,3]) 

for i in range(4): 
    zz[i,:,:] = np.dot(np.array([puy[:,i]]).T, 
       np.array([puy2.T[i,:]])) 

回答

6

一種方法是使用np.einsum,這使得您指定要發生的指數是什麼:

>>> np.einsum('ik,jk->kij', puy, puy2) 
array([[[ 0, 0, 0], 
     [ 0, 16, 32]], 

     [[ 1, 5, 9], 
     [ 5, 25, 45]], 

     [[ 4, 12, 20], 
     [12, 36, 60]], 

     [[ 9, 21, 33], 
     [21, 49, 77]]]) 
>>> np.allclose(np.einsum('ik,jk->kij', puy, puy2), zz) 
True