2015-05-09 48 views
2

我有3軸的數組:如何使用numpy的einsum獲取子數組的點積?

a = [[[1,2,3], [4,5,6], [7,8,9]], 
    [[9,8,7], [6,5,4], [3,2,1]], 
    [[1,1,1], [2,2,2], [3,3,3]]] 

我想使用einsum非迭代地採取各向量的點積在「A」與基質:

m = [[a, b, c], 
    [d, e, f], 
    [g, h, i]] 

這樣

product = [[dot(m,a[1,1,:]), dot(m,a[1,2,:]), dot(m,a[1,3,:])], 
      [dot(m,a[2,1,:]), dot(m,a[2,2,:]), dot(m,a[2,3,:])], 
      [dot(m,a[3,1,:]), dot(m,a[3,2,:]), dot(m,a[3,3,:])]] 

獲得具有相同形狀作爲初始陣列「A」的陣列。我一直在嘗試使用Einsum,但我無法實現它。

回答

2

這應該做的伎倆,假設你是「點睛」的m與最後的a末維:

np.einsum('ij,klj->ikl',m,a) 
+0

謝謝!這很有效,但它將我的初始數組的形狀從(x,y,z)更改爲(y,z,x)。 –

+0

它看起來像改變「ikl」到「kli」是修復。 –

+0

是的,輸出數組中的索引可以重新排列。由於您的尺寸是相同的,因此順序上的差異並不明顯。 – hpaulj