全部与全部点积

All vs All dot product

我有两个二维 numpy 数组 AB,尺寸如下 (row, cols)

A.shape = (3000, 128)B.shape = (5000, 128)

我希望对 A 的每一行与 B 的每一行进行点积。例如;

np.dot(A[0], B[0])
np.dot(A[0], B[1]
np.dot(A[0], B[2]
 .   *  .
 .   *  .  
 .   *  .
np.dot(A[0], B[last]) # last row in B
np.dot(A[1], B[0]) # new row in A
np.dot(A[1], B[1])
np.dot(A[1], B[2])
 .   *  .
 .   *  .  
 .   *  .
np.dot(A[last], B[last]) # last operation

这个操作有具体的名称吗?

现在我有两个 for 循环,我想这很慢。

all_dots = []
for i in range(0, len(A)):
    for j in range(0, len(B)):
        all_dots.append(np.dot(B[j], A[i]))

我正在寻找线性代数中的本机运算来更有效地解决这个问题。

提前致谢!

是矩阵乘积。第一个矩阵的列数应等于第二个矩阵的行数

np.dot(A, B.transpose())

这与您的带有两个嵌套循环的代码所产生的效果相同。另一种方法是使用矩阵乘法运算符 @.transpose()

的快捷方式 .T
A @ B.T

或numpy数组的.dot()方法

A.dot(B.transpose())

感谢丹!

你也可以使用臭名昭著的 einsum:

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

测试:

a, b = np.arange(12).reshape(3,4), np.arange(16).reshape(4,4)

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

输出:

array([[ 14,  38,  62,  86],
       [ 38, 126, 214, 302],
       [ 62, 214, 366, 518]])

如果你想要一个一维数组,用 .flatten()ravel() 链接它:

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

输出:

array([ 14,  38,  62,  86,  38, 126, 214, 302,  62, 214, 366, 518])