Numpy Matmul 忽略第一轴
Numpy Matmul while ignoring first axis
我在一个形状为 (1000, 5)
的二维数组中有一堆形状为 (5,)
的 5 维向量,我想将每个形状乘以一个形状为 [= 的矩阵13=].
我本以为广播能让我做到
A = np.random.rand(1000, 5)
B = np.random.rand(1, 6, 5) # empty axis for broadcasting
np.matmul(B, A)
但这不能正常工作。
有没有办法进行这种乘法运算,以便 np.matmul(B, A)
产生形状为 (1000, 6)
的输出?
我刚刚找到答案。解决方案是将数组格式化为
A = np.ones((100, 5, 1))
B = np.ones((6, 5))
np.matmul(B, A)
然后广播就出来了。希望这对您有所帮助!
如果你真的有这个:
A = np.random.rand(1000, 5)
B = np.random.rand(6, 5)
那么执行此操作的更简单的方法是
A @ B.T
或
A.dot(B.T)
记住矩阵乘法是内积,所以内维必须匹配(在这种情况下,是 5
)。通过转置 .T
,您可以交换 6
和 5
维度以使它们按正确的顺序排列。
如果您不想玩这个顺序(假设您有很多维度),您也可以随时使用 np.einsum
显式设置轴
np.einsum('ij,kj->ik', A, B, optimize = True)
optimize
几乎与 .dot()
或 @
一样快,但目前仅在您不需要在输入上广播维度时才有效(您不需要在这里)。
我在一个形状为 (1000, 5)
的二维数组中有一堆形状为 (5,)
的 5 维向量,我想将每个形状乘以一个形状为 [= 的矩阵13=].
我本以为广播能让我做到
A = np.random.rand(1000, 5)
B = np.random.rand(1, 6, 5) # empty axis for broadcasting
np.matmul(B, A)
但这不能正常工作。
有没有办法进行这种乘法运算,以便 np.matmul(B, A)
产生形状为 (1000, 6)
的输出?
我刚刚找到答案。解决方案是将数组格式化为
A = np.ones((100, 5, 1))
B = np.ones((6, 5))
np.matmul(B, A)
然后广播就出来了。希望这对您有所帮助!
如果你真的有这个:
A = np.random.rand(1000, 5)
B = np.random.rand(6, 5)
那么执行此操作的更简单的方法是
A @ B.T
或
A.dot(B.T)
记住矩阵乘法是内积,所以内维必须匹配(在这种情况下,是 5
)。通过转置 .T
,您可以交换 6
和 5
维度以使它们按正确的顺序排列。
如果您不想玩这个顺序(假设您有很多维度),您也可以随时使用 np.einsum
np.einsum('ij,kj->ik', A, B, optimize = True)
optimize
几乎与 .dot()
或 @
一样快,但目前仅在您不需要在输入上广播维度时才有效(您不需要在这里)。