NumPy矩阵乘法的形状

5
在矩阵乘法中,假设 A 是一个 3 x 2 的矩阵(3 行,2 列),B 是一个 2 x 4 的矩阵(2 行,4 列),那么如果一个矩阵 C = A * B,那么 C 应该有 3 行和 4 列。为什么 numpy 没有进行这种乘法运算呢?当我尝试下面的代码时,会出现错误:ValueError: operands could not be broadcast together with shapes (3,2) (2,4)
a = np.ones((3,2))
b = np.ones((2,4))
print a*b

我尝试交换A和B并且总是得到相同的答案。为什么?在这种情况下如何进行矩阵乘法运算?

1个回答

19
* 运算符用于numpy数组表示逐元素乘法(类似于相同维数的数组的Hadamard乘积),而不是矩阵乘法。
例如:
>>> a
array([[0],
       [1],
       [2]])
>>> b
array([0, 1, 2])
>>> a*b
array([[0, 0, 0],
       [0, 1, 2],
       [0, 2, 4]])

使用numpy数组进行矩阵乘法:

>>> a = np.ones((3,2))
>>> b = np.ones((2,4))
>>> np.dot(a,b)
array([[ 2.,  2.,  2.,  2.],
       [ 2.,  2.,  2.,  2.],
       [ 2.,  2.,  2.,  2.]])

此外,您还可以使用矩阵类:
>>> a=np.matrix(np.ones((3,2)))
>>> b=np.matrix(np.ones((2,4)))
>>> a*b
matrix([[ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.],
        [ 2.,  2.,  2.,  2.]])

可以在这里找到有关广播numpy数组的更多信息,以及可以在这里找到矩阵类的更多信息。


在使用定义了“LinearOperator”类的sparse.linalg numpy扩展时,需要小心。在这个类中,“*”运算符被解释为通常的矩阵点积。 - Guillaume
何时应该使用numpy矩阵而不是数组?直到最近,我甚至都不知道有矩阵API。 - Charlie Parker
@CharlieParker 我不建议使用矩阵,我认为它们被标记为即将废弃。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接