[英]How to generalize elementwise matrix operations in numpy
假設我有兩個由3xn數組V和W表示的n個向量的集合,以及由3x3xn數組Q表示的n個矩陣的集合。我如何向量化運算以給我
a)范圍(n)中k的n個向量Q[:,:,k]*V[:,k]
的集合
b)對於范圍為(n)的k的n個標量W[:,k].T*Q[:,:,k]*V[:,k]
的集合
在此,乘法將被解釋為矩陣乘法。 我覺得應該使用的einsum文檔沒有意義。 任何澄清/解決方案將不勝感激。
a)范圍(n)中k的n個向量Q [:,:,k] * V [:,k]的集合
np.einsum('ijk,jk->ik', Q, v)
應該產生一個(3,n)數組。 矩陣乘積求和超過j
。
b)對於范圍為(n)的k的n個標量W [:,k] .T * Q [:,:,k] * V [:,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])
並使用Jaime的評論:
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]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.