使用 Python numpy einsum 获取 2 个矩阵之间的点积

bFi*_*ig8 2 python numpy matrix dot-product

刚遇到这个:

用 Scipy 计算两个矩阵的行式点积的矢量化方法

这个 numpy.einsum 真的很棒,但使用起来有点混乱。假设我有:

import numpy as np
a = np.array([[1,2,3], [3,4,5]])
b = np.array([[0,1,2], [1,1,7]])
Run Code Online (Sandbox Code Playgroud)

我将如何使用 einsum 中的“ij”来获得 a 和 b 之间的“交叉点积”?

使用这个例子基本上我想计算的点积

[1,2,3] 和 [0,1,2]

[1,2,3] 和 [1,2,7]

[3,4,5] 和 [0,1,2]

[3,4,5] 和 [1,1,7]

并以 [[8,26],[14,42]] 结束

我知道如果我使用

np.einsum("ij,ij->i",a,b)
Run Code Online (Sandbox Code Playgroud)

我最终会得到 [8, 42] 这意味着我缺少“交叉”元素

Psi*_*dom 5

您的结果仍然是二维的,因此您需要两个索引。您需要的是矩阵乘法与转置的第二个数组,因此不是 normal ij,jk->ik,而是通过ij,kj->ik以下方式转置第二个矩阵:

np.einsum('ij,kj->ik', a, b)

#array([[ 8, 24],
#       [14, 42]])
Run Code Online (Sandbox Code Playgroud)

这相当于:

np.dot(a, b.T)

#array([[ 8, 24],
#       [14, 42]])
Run Code Online (Sandbox Code Playgroud)
import numpy as np
a = np.array([[1,2,3], [3,4,5]])
b = np.array([[0,1,2], [1,1,7]])
Run Code Online (Sandbox Code Playgroud)

  • 您可以阅读 [this](/sf/ask/1826292541/),或 [this](http://ajcr.net/Basic-guide-to-einsum/) 和一些关于[爱因斯坦符号](https://en.wikipedia.org/wiki/Einstein_notation)的解释也可能有所帮助。 (2认同)