假設我有兩組由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]
的被解釋爲矩陣乘法。無法理解我認爲應該使用的唯一文檔。任何澄清/解決方案,將不勝感激。
假設我有兩組由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]
的被解釋爲矩陣乘法。無法理解我認爲應該使用的唯一文檔。任何澄清/解決方案,將不勝感激。
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]])
對於更一般的解決方案,是否可以用'...'替換這些'k'索引? – Jaime
@hpaulj - 無不是總結通過k個。對於每個k(a)將是一個矩陣乘以一個向量,對於(b)它將是一個標量。 – user3799584