簡體   English   中英

使用numpy einsum計算矩陣的列向量的內積

[英]Using numpy einsum to compute inner product of column-vectors of a matrix

假設我有一個像這樣的numpy矩陣:

[[   1    2    3]
 [  10  100 1000]]

我想計算每個列本身的內積,因此結果將是:

[1*1 + 10*10    2*2 + 100*100    3*3 + 1000*1000] == [101, 10004, 1000009]

我想知道使用einsum函數是否可能(並更好地理解它)。

到目前為止,我可以得到的最接近的結果是:

import numpy as np

arr = np.array([[1, 2, 3], [10, 100, 1000]])

res = np.einsum('ij,ik->jk', arr, arr)

# [[    101    1002   10003]
#  [   1002   10004  100006]
#  [  10003  100006 1000009]]

對角線包含預期的結果,但是我想知道是否可以避免邊緣計算。

使用np.einsum ,就像這樣-

np.einsum('ij,ij->j',arr,arr)

樣品運行-

In [243]: np.einsum('ij,ij->j',arr,arr)
Out[243]: array([    101,   10004, 1000009])

或使用np.sum

In [244]: (arr**2).sum(0)
Out[244]: array([    101,   10004, 1000009])

或使用numexpr模塊 -

In [248]: import numexpr as ne

In [249]: ne.evaluate('sum(arr**2,0)')
Out[249]: array([    101,   10004, 1000009])

通過Divakar的einsum答案的一個中間步驟,可以直觀地理解您的期望。

In [19]: arr
Out[19]: 
array([[   1,    2,    3],
       [  10,  100, 1000]])

# simply take element-wise product with the array itself
In [20]: np.einsum('ij, ij -> ij', arr, arr)
Out[20]: 
array([[      1,       4,       9],
       [    100,   10000, 1000000]])

但是,這不會產生您期望的結果。 因此,如果您觀察到以上結果,我們只需要沿第一維 (即軸0) 求和即可 因此,我們在einsum結果中的->之后省略了下標i ,這意味着我們要求它沿該軸求和,從而得出期望的結果為:

In [21]: np.einsum('ij, ij -> j', arr, arr)
Out[21]: array([    101,   10004, 1000009])

PS另外,對於np.einsum的一般理解,請參見此處的詳細討論: 理解-numpy-einsum

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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