【问题标题】:Using numpy einsum to compute inner product of column-vectors of a matrix使用 numpy einsum 计算矩阵的列向量的内积
【发布时间】:2018-06-12 12:12:27
【问题描述】:

假设我有一个像这样的 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]]

对角线包含预期结果,但我想知道是否可以避免边缘计算。

【问题讨论】:

    标签: python numpy matrix multidimensional-array numpy-einsum


    【解决方案1】:

    使用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 module -

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

    【讨论】:

      【解决方案2】:

      您在这里的期望可以直观地理解,只需从Divakar's einsum answer 进行一个中间步骤。

      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])
      

      附:另外,对于np.einsum的一般理解,请看这里的详细讨论:understanding-numpy-einsum

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 2020-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        相关资源
        最近更新 更多