NumPy矩阵加列向量

and*_*qst 6 python numpy vector matrix linear-algebra

我在用numpy.matrix.如果我添加一个3x3带有1x3,或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)
Run Code Online (Sandbox Code Playgroud)

输出:

matrix([[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]])
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 9

这被称为"广播".从手册:

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


ask*_*han 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.]])
Run Code Online (Sandbox Code Playgroud)

但我想警告你没有numpy.matrix按照规定使用.事实上,你正在使用numpy.ndarray因为np.ones返回ndarray而不是a 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.]])
Run Code Online (Sandbox Code Playgroud)