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,您可以交换 65 维度以使它们按正确的顺序排列。

如果您不想玩这个顺序(假设您有很多维度),您也可以随时使用 np.einsum

显式设置轴
np.einsum('ij,kj->ik', A, B, optimize = True)

optimize 几乎与 .dot()@ 一样快,但目前仅在您不需要在输入上广播维度时才有效(您不需要在这里)。