2015-04-20 11 views
2

假設我有兩組由n個向量表示的3×n數組V和W以及由3×3×n數組Q表示的一組n個矩陣。我如何矢量化給出的運算如何推廣numpy中的元素矩陣運算

a)該組n個矢量Q[:,:,k]*V[:,k]對於k在範圍(n)的

b)對於範圍(N K)

在這裏,乘法是組n個標量W[:,k].T*Q[:,:,k]*V[:,k]的被解釋爲矩陣乘法。無法理解我認爲應該使用的唯一文檔。任何澄清/解決方案,將不勝感激。

+0

@hpaulj - 無不是總結通過k個。對於每個k(a)將是一個矩陣乘以一個向量,對於(b)它將是一個標量。 – user3799584

回答

3

a)該組n個向量Q [:,:,k]的* V [:,k]的有效範圍內的K(n)的

np.einsum('ijk,jk->ik', Q, v) 

應產生一個(3, n)數組。矩陣產品總和超過j

b)該組n個標量W [:,k]的.T * Q [:,:,k]的* V [:,k]的有效範圍內的(N K)

np.einsum('ik,ijk,jk->k', W, Q, V) 

我從記憶中工作,我最好猜測你需要什麼。所以我的'ij'表達式可能需要調整。但請試一試,讓我知道它是如何工作的。


測試

In [180]: V=W=np.arange(3*n).reshape(3,n) 

In [181]: Q=np.arange(3*3*n).reshape(3,3,n) 

In [182]: np.einsum('ijk,jk->ik',Q,V) 
Out[182]: 
array([[ 80, 107, 140, 179], 
     [224, 287, 356, 431], 
     [368, 467, 572, 683]]) 

In [183]: np.einsum('ik,ijk,jk',W,Q,V) 
Out[183]: 28788 # summation over k 

In [184]: np.einsum('ik,ijk,jk->k',W,Q,V) 
Out[184]: array([ 3840, 5745, 8136, 11067]) 

有些時候打破einsum成幾個步驟是更快,因爲它使迭代空間距離變得過於龐大。我不認爲在這裏是這種情況,但這是看起來像什麼。

In [185]: np.einsum('jk,jk->k',np.einsum('ik,ijk->jk',W,Q),V) 
Out[185]: array([ 3840, 5745, 8136, 11067]) 

,並使用海梅的評論:

In [186]: np.einsum('i...,ij...,j...',W,Q,V) 
Out[186]: array([ 3840, 5745, 8136, 11067]) 

In [187]: np.einsum('ij...,j...->i...',Q,V) 
Out[187]: 
array([[ 80, 107, 140, 179], 
     [224, 287, 356, 431], 
     [368, 467, 572, 683]]) 
+0

對於更一般的解決方案,是否可以用'...'替換這些'k'索引? – Jaime