NumPy矩阵加列向量

6
我正在使用numpy.matrix。如果我将一个3x3矩阵与一个1x3或3x1的向量相加,将得到一个3x3矩阵。 这应该不是未定义的吗? 如果不是,那么这是怎么解释的呢?
示例:
a = np.matrix('1 1 1; 1 1 1; 1 1 1')
b = np.matrix('1 1 1')
a + b #or a + np.transpose(b)

输出:

matrix([[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]])
2个回答

9
这被称为“广播”。来自手册
术语“广播”描述了numpy在算术运算期间如何处理具有不同形状的数组。在特定约束条件下,较小的数组会“广播”到较大的数组上,使它们具有兼容的形状。广播提供了一种向量化数组操作的方法,因此循环发生在C中而不是Python中。它这样做而不会制造不必要的数据副本,并且通常导致高效的算法实现。然而,在某些情况下,广播是一个坏主意,因为它导致内存使用不当,从而减慢了计算速度。

谢谢,这解释得很清楚。虽然错误信息已经指向了它,但我还没有理解这个概念。"ValueError: operands could not be broadcast together with shapes ..." - andershqst

5

如果你想将一个向量添加到矩阵中,可以通过选择它应该放置的位置来实现:

In [155]: ma = np.matrix(
     ...:     [[ 1.,  1.,  1.],
     ...:      [ 1.,  1.,  1.],
     ...:      [ 1.,  1.,  1.]])

In [156]: mb = np.matrix([[1,2,3]])

In [157]: ma[1] += mb # second row

In [158]: ma
Out[158]: 
matrix([[ 1.,  1.,  1.],
        [ 2.,  3.,  4.],
        [ 1.,  1.,  1.]])

In [159]: ma[:,1] += mb.T # second column

In [160]: ma
Out[160]: 
matrix([[ 1.,  2.,  1.],
        [ 2.,  5.,  4.],
        [ 1.,  4.,  1.]])

但是我想提醒您,您并没有使用所述的numpy.matrix。实际上,您正在使用numpy.ndarray,因为np.ones返回一个ndarray而不是一个matrix

添加仍然是相同的,但创建一些矩阵,您会发现它们的行为不同:

In [161]: ma*mb
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

ValueError: matrices are not aligned

In [162]: mb*ma
Out[162]: matrix([[ 6.,  6.,  6.]])

In [163]: ma*mb.T
Out[163]: 
matrix([[ 6.],
        [ 6.],
        [ 6.]])

In [164]: aa = np.ones((3,3))

In [165]: ab = np.arange(1,4)

In [166]: aa*ab
Out[166]: 
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])

In [167]: ab*aa
Out[167]: 
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])

啊,你说的矩阵是对的。我会更正我的问题。不过,我的问题是关于加法的,其中广播似乎像被接受的答案所指出的那样起作用。 - andershqst
是的,请这么做;我只是想提醒您可能会出现意外行为。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接