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

Using Python numpy einsum to obtain dot product between 2 Matrices

刚刚发现这个:

Vectorized way of calculating row-wise dot product two matrices with 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]])

我如何使用 einsum 中的 "ij" 得到 a 和 b 之间的 "cross dot product"?

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

的点积

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

我会以 [8, 42] 结尾,这意味着我缺少 "cross" 元素

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

转置第二个矩阵,而不是正常的 ij,jk->ik
np.einsum('ij,kj->ik', a, b)

#array([[ 8, 24],
#       [14, 42]])

相当于:

np.dot(a, b.T)

#array([[ 8, 24],
#       [14, 42]])

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