所有与所有点积



我有两个 2D 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())

这会产生与具有两个嵌套循环的代码相同的功能。另一种方法是使用矩阵乘法运算符@和快捷键.T进行.transpose()

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

相关内容

  • 没有找到相关文章

最新更新