10

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

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

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

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

任何帮助表示赞赏!

谢谢!

4

2 回答 2

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 矩阵计算 AB。

如果您想知道它为什么这样做而不是报告错误,那是因为 np.matrix 继承自 np.array。np.matrix 覆盖乘法,但不覆盖加法和减法,因此它使用基于 np.array 的操作,当维度允许时广播。

于 2013-04-03T20:41:33.740 回答
1

我无法真正解释其中的原因,因为我经常使用np.matrix而不是np.array来防止这种事情。感谢@Jaime 在上面评论中的链接,很明显这np.matrix只是一个np.ndarray重新定义的中缀操作的子类,其中线性代数有适当的答案。在没有的地方,它依赖于np.ndarraywith的规则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]])
于 2013-04-03T19:30:59.617 回答