全部与全部点积
All vs All dot product
我有两个二维 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())
这与您的带有两个嵌套循环的代码所产生的效果相同。另一种方法是使用矩阵乘法运算符 @
和 .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])
我有两个二维 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())
这与您的带有两个嵌套循环的代码所产生的效果相同。另一种方法是使用矩阵乘法运算符 @
和 .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])