【问题标题】:How to subtract from columns and not rows in NumPy matrices?如何从 NumPy 矩阵中的列而不是行中减去?
【发布时间】:2017-06-22 10:15:38
【问题描述】:

我有一个矩阵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]]

【问题讨论】:

  • X - b.transpose() 有什么问题?在这里似乎是一个完全有效的解决方案。
  • @ajcr 你真的尝试过吗? BKS,您可以将 b 转换为数组,然后使用 b[:, None]
  • @PaulPanzer:我的意思是 方法 很好(将“行”向量转换为“列”向量然后减去),并不是说该代码可以正常工作是字面上写的。
  • 关于为什么b.transpose() 不起作用的扩展答案,stackoverflow.com/a/35256816/901925

标签: python numpy matrix transpose


【解决方案1】:

使用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]]

【讨论】:

  • vstack 是将b 转换为 (4,1) 数组的非常规方式。我会使用b[:,np.newaxis]
  • 查看vstack 的python 代码,看看我为什么不鼓励这种用法。它将b 的每个元素转换为二维数组,然后将它们连接起来。
  • @hpaulj,你有什么建议?
【解决方案2】:

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

>>> 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.]])

【讨论】:

  • @hpaulj 抱歉,不会再发生 ;-) 更严重的是,我不会用驳船碰np.matrix,无论如何。
  • 我第一次发表评论时没有注意到您的None 回答。 matrix 有它的用途,但它常常让初学者感到困惑。
猜你喜欢
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2014-10-21
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多