Numpy矩阵减法混淆

时间:2013-04-03 19:20:20

标签: python matrix numpy

我对使用两个numpy矩阵意外执行的操作的结果有疑问(后来修复了)。

假设我有一个列向量,A = [1,2,3],行向量B = [1,1,1]。据我所知,没有正确的数学方法来“减去”这两个向量,即这应该是一个未定义的操作。但是,当我这样做时,我会回来:

>>> matrix([[0, 1, 2],
            [0, 1, 2],
            [0, 1, 2]])

我认为这可能是某种广播操作,但这仍然让我感到麻烦。 numpy.matrix对象不应只包含数学上有效的矩阵运算吗?

感谢任何帮助!

谢谢!

2 个答案:

答案 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.ndarrayndim = 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]])