簡體   English   中英

如何在numpy中概括元素級矩陣運算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM