我有两个 2D numpy 数组A
和B
,维度如下(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])