Numpy中的矩阵乘法分为两大情况,使用numpy.array和使用numpy.matrix.

Numpy重载了*操作符,可以直接对array或者matrix对象进行乘法运算,但是在不同对象上,其意义是有区别的。

对于array对象

*(或者multiply)代表的是并不是矩阵的乘法规则,而是简单的数量积,即对应位置元素相乘后的积相加。

验证结果如下:

>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[4,3],[2,1]])
>>> a*b
array([[4,6],
[6,4]])

如果在array对象上要进行严格的矩阵乘法,即矢量乘法,则必须使用.dot()或者.matmul()函数,两者是等效的,我们可以通过查阅官网文档得知。
numpy.dot

numpy.matmul

在IDLE上运行结果如下:

>>> np.dot( a, b)
array([[ 8, 5],
[20, 13]])
>>> np.matmul( a, b)
array([[ 8, 5],
[20, 13]])

可以看到两者的运行结果一致,都是矩阵的矢量积结果。

对于matrix对象

对于matrix,情况就恰恰相反了。* 表示的是矢量积,如果希望以数量积方式运行,则必须使用np.multiply函数。因为*重载矩阵运算规则只限于matrix对象。 在IDLE中验证如下:

>>> a = np.matrix([[1,2],[3,4]])
>>> b = np.matrix([[4,3],[2,1]])
>>> a*b
matrix([[ 8, 5],
[20, 13]])
>>> np.multiply(a,b)
matrix([[4, 6],
[6, 4]])

总结

  • 对于array对象,*和np.multiply函数代表的是数量积,如果希望使用矩阵的乘法规则,则应该调用np.dot和np.matmul函数。
  • 对于matrix对象,*直接代表了原生的矩阵乘法,而如果特殊情况下需要使用数量积,则应该使用np.multiply函数。
  • 对于array对象,在需要矩阵乘法的时候,也利用np.asmatrix转换成matrix对象