Numpy Matmul忽略了第一个轴

时间:2018-02-22 04:27:12

标签: python numpy numpy-broadcasting

我在形状(1000,5)的三维阵列中有一堆形状(5)的5维向量,其中每一个我想要乘以形状矩阵(6,5)。我会假设广播可以让我做

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

2 个答案:

答案 0 :(得分:1)

如果你确实有这个:

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()@一样快,但目前只有在您不需要在输入上广播维度时才会有效(您不需要&#39} ;这里)。

答案 1 :(得分:0)

我只想出答案。解决方案是将数组格式化为

A = np.ones((100, 5, 1))
B = np.ones((6, 5))
np.matmul(B, A)

广播出来了。希望这有帮助!