如何从 NumPy 矩阵中的列而不是行中减去?

How to subtract from columns and not rows in NumPy matrices?

我有一个矩阵X:

[[  2.  nan  nan  nan]
 [  3.   2.  nan  nan]
 [ nan   5.   5.  nan]
 [ nan  nan  nan  nan]]

还有一个列表b:

[-1.0, 2.0, 0.5, -2.0]

当我执行 X - b 时,我得到:

[[ 3.   nan  nan  nan]
 [ 4.   0.   nan  nan]
 [ nan  3.   4.5  nan]
 [ nan  nan  nan  nan]]

如果我想跨列而不是跨行减去 b 怎么办?

我正在寻找 X - b.transpose():

[[ 3.   nan  nan  nan]
 [ 1.   0.   nan  nan]
 [ nan  4.5  4.5  nan]
 [ nan  nan  nan  nan]]

使用numpy.vstack函数的解决方案(垂直堆叠数组):

a = np.array([[ 2.0,  np.NaN,  np.NaN,  np.NaN],
     [  3.0,   2.0, np.NaN,  np.NaN],
     [ np.NaN,   5.0,   5.0,  np.NaN],
     [ np.NaN,  np.NaN,  np.NaN,  np.NaN]])

b = np.array([-1.0, 2.0, 0.5, -2.0])
print(a - np.vstack(b))

输出:

[[ 3.   nan  nan  nan]
 [ 1.   0.   nan  nan]
 [ nan  4.5  4.5  nan]
 [ nan  nan  nan  nan]]

这里有一个值得指出的问题:

>>> a = np.identity(4)
>>> a
array([[ 1.,  0.,  0.,  0.],                                                                                                                                
       [ 0.,  1.,  0.,  0.],                                                                                                                                
       [ 0.,  0.,  1.,  0.],                                                                                                                                
       [ 0.,  0.,  0.,  1.]])                                                                                                                               
>>> b = [1,2,3,4]                                                                                                                     
>>> a-b                                                                                                                                                     
array([[ 0., -2., -3., -4.],                                                                                                                                
       [-1., -1., -3., -4.],                                                                                                                                
       [-1., -2., -2., -4.],                                                                                                                                
       [-1., -2., -3., -3.]])                                                                                                                               
>>> a-np.matrix(b)
matrix([[ 0., -2., -3., -4.],                                                                                                                               
        [-1., -1., -3., -4.],                                                                                                                               
        [-1., -2., -2., -4.],                                                                                                                               
        [-1., -2., -3., -3.]])                                                                                                                              
>>> a-np.array(b)                                                                                                                                     
array([[ 0., -2., -3., -4.],                                                                                                                                
       [-1., -1., -3., -4.],                                                                                                                                
       [-1., -2., -2., -4.],                                                                                                                                
       [-1., -2., -3., -3.]])
>>> a-np.matrix(b).T  # T is short for transpose()
matrix([[ 0., -1., -1., -1.],
        [-2., -1., -2., -2.],
        [-3., -3., -2., -3.],
        [-4., -4., -4., -3.]])

但是:

>>> a-np.array(b).T
array([[ 0., -2., -3., -4.],
       [-1., -1., -3., -4.],
       [-1., -2., -2., -4.],
       [-1., -2., -3., -3.]])

对于一维数组 .T 什么都不做!改用

>>> a-np.array(b)[:, None]
array([[ 0., -1., -1., -1.],
       [-2., -1., -2., -2.],
       [-3., -3., -2., -3.],
       [-4., -4., -4., -3.]])