我无法真正解释这个理由,因为我经常使用
np.matrix
而不是
np.array
来避免这种情况。感谢 @Jaime 在上面的评论中提供的链接,清楚地表明
np.matrix
只是一个从
np.ndarray
派生出来的子类,其中重新定义了中缀运算,在线性代数中有适当的答案。在没有适当答案的情况下,它会回退到具有
ndim = 2
的
np.ndarray
规则。
看起来
加法遵循矩阵乘法规则,其中从
A
中选择哪些元素与
B
中的哪些元素配对:
In [1]: import numpy as np
In [2]: A = np.matrix([1,2,3]).T
In [3]: B = np.matrix([1,1,1])
In [4]: A
Out[4]:
matrix([[1],
[2],
[3]])
In [5]: B
Out[5]: matrix([[1, 1, 1]])
In [6]: A+B
Out[6]:
matrix([[2, 2, 2],
[3, 3, 3],
[4, 4, 4]])
In [7]: A*B
Out[7]:
matrix([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
这是使用
np.array
时得到的相同行为:
In [9]: a = np.arange(3)[...,None]
In [10]: b = np.arange(3)
In [11]: a
Out[11]:
array([[0],
[1],
[2]])
In [12]: b
Out[12]: array([0, 1, 2])
In [13]: a+b
Out[13]:
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
np.matrix
与np.ndarray
的广播规则有很大不同。 - askewchanmatrix
是ndarray
的子类,它们遵循完全相同的广播规则。主要区别在于__getitem__
方法确保始终保留2D对象和__mul__
使用.dot
而不是np.multiply
。源代码是纯Python,非常易于理解。 - Jaimenp.matrix
被反对的部分原因是由于其不一致的行为。如果您使用的是1D的ndarray
,则不会意外获得2D数组。广播是一个在np.ndarray
中定义良好的操作,即使对于其matrix
子类也适用相同的规则,即使它与“数学矩阵”所期望的不同。 - jorgeca