NumPy矩阵加列向量

时间:2013-04-01 13:28:28

标签: python vector matrix numpy linear-algebra

我正在使用numpy.matrix。如果我使用3x31x3向量添加3x1矩阵,我会得到一个3x3矩阵。

这不应该是undefined吗? 如果没有,对此有何解释?

示例:

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 个答案:

答案 0 :(得分:9)

这称为“广播”。来自manual

  

术语广播描述了numpy如何在算术运算期间处理具有不同形状的数组。受某些约束的影响,较小的阵列在较大的阵列上“广播”,以便它们具有兼容的形状。广播提供了一种矢量化数组操作的方法,以便在C而不是Python中进行循环。它可以在不制作不必要的数据副本的情况下实现这一点,并且通常会导致高效的算然而,有些情况下广播是一个坏主意,因为它会导致内存使用效率低下,从而减慢计算速度。

答案 1 :(得分: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.]])