【问题标题】:numpy divide row by row sumnumpy逐行总和
【发布时间】:2013-04-18 14:46:23
【问题描述】:

如何将一个 numpy 数组行除以该行中所有值的总和?

这是一个例子。但我很确定有一种花哨且更有效的方法:

import numpy as np
e = np.array([[0., 1.],[2., 4.],[1., 5.]])
for row in xrange(e.shape[0]):
    e[row] /= np.sum(e[row])

结果:

array([[ 0.        ,  1.        ],
       [ 0.33333333,  0.66666667],
       [ 0.16666667,  0.83333333]])

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

    方法#1:使用None(或np.newaxis)添加一个额外的维度,以便广播将起作用:

    >>> e
    array([[ 0.,  1.],
           [ 2.,  4.],
           [ 1.,  5.]])
    >>> e/e.sum(axis=1)[:,None]
    array([[ 0.        ,  1.        ],
           [ 0.33333333,  0.66666667],
           [ 0.16666667,  0.83333333]])
    

    方法#2:转置-happy:

    >>> (e.T/e.sum(axis=1)).T
    array([[ 0.        ,  1.        ],
           [ 0.33333333,  0.66666667],
           [ 0.16666667,  0.83333333]])
    

    (如果您愿意,可以删除axis= 部分以简洁明了。)

    方法#3:(从 Jaime 的评论中提升)

    使用sum 上的keepdims 参数来保留维度:

    >>> e/e.sum(axis=1, keepdims=True)
    array([[ 0.        ,  1.        ],
           [ 0.33333333,  0.66666667],
           [ 0.16666667,  0.83333333]])
    

    【讨论】:

    • 我不明白您如何删除axis=1。如果没有 axis 参数,sum() 返回数组中所有值的总和。
    • 在 numpy 1.7 中有一个 keepdims 参数可以让您执行 e/e.sum(axis=1, keepdims=True)
    • @WarrenWeckesser:我不是说你可以放弃1 部分,我说你可以放弃axis= 部分。
    • 啊,我误会你的意思了。
    • 你能明确解释一下[:,None] 符号吗?我看到了它所做的改变,但没有得到编码约定。
    【解决方案2】:

    您可以在数学上使用

    这里,E 是您的原始矩阵,D 是一个对角矩阵,其中每个条目是 E 中相应行的总和。如果你有幸拥有一个可逆的D,这是一种在数学上非常方便的处理方式。

    在 numpy 中:

    import numpy as np
    
    diagonal_entries = [sum(e[row]) for row in range(e.shape[0])]
    D = np.diag(diagonal_entries)
    D_inv = np.linalg.inv(D)
    e = np.dot(e, D_inv)
    

    【讨论】:

    • 虽然这个答案可能是正确的,但使用 for 循环并不是解决问题的方法。它没有完全矢量化。投反对票。
    【解决方案3】:

    你也可以使用numpy的reshape方法如下:

    e = np.array([[0., 1.],[2., 4.],[1., 5.]])
    e/=np.sum(e, axis=1).reshape(-1,1)
    e
    
    array([[0.        , 1.    ],
           [0.33333333, 0.66666667],
           [0.16666667, 0.83333333]])
    

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 2018-07-25
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多