我对使用两个numpy矩阵意外执行的操作的结果有疑问(后来修复了)。
假设我有一个列向量,A = [1,2,3],行向量B = [1,1,1]。据我所知,没有正确的数学方法来“减去”这两个向量,即这应该是一个未定义的操作。但是,当我这样做时,我会回来:
>>> matrix([[0, 1, 2],
[0, 1, 2],
[0, 1, 2]])
我认为这可能是某种广播操作,但这仍然让我感到麻烦。 numpy.matrix对象不应只包含数学上有效的矩阵运算吗?
感谢任何帮助!
谢谢!
答案 0 :(得分:2)
A和B正在一起播放:
A = np.matrix([[1],[2],[3]])
#a 3x1 vector
#1
#2
#3
B = np.matrix([[1,1,1]])
#a 1x3 vector
#1 1 1
A-B
#a 3x3 vector
#0 0 0
#1 1 1
#2 2 2
A将其1号尺寸(列)广播到
#1 1 1
#2 2 2
#3 3 3
B沿其1号尺寸(行)广播到
#1 1 1
#1 1 1
#1 1 1
然后像往常一样计算两个3x3矩阵的A-B。
如果您想知道它为什么这样做而不是报告错误,那是因为np.matrix继承自np.array。 np.matrix重写乘法,但不包括加法和减法,因此它使用基于np.array的操作,当维度允许时,它会广播。
答案 1 :(得分:0)
我无法解释其基本原理,因为我经常使用np.matrix
代替np.array
来阻止此类事情。感谢上面评论中@ Jaime的链接,很明显np.matrix
只是来自np.ndarray
的子类,具有重新定义的中缀操作,其中有来自线性代数的适当答案。如果没有,则会依据np.ndarray
与ndim = 2
的规则。
似乎添加遵循矩阵乘法规则,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]])