numpy divide row by row sum

后端 未结 3 792
栀梦
栀梦 2020-12-07 18:24

How can I divide a numpy array row by the sum of all values in this row?

This is one example. But I\'m pretty sure there is a fancy and much more efficient way of do

相关标签:
3条回答
  • 2020-12-07 18:59

    You can do it mathematically as .

    Here, E is your original matrix and D is a diagonal matrix where each entry is the sum of the corresponding row in E. If you're lucky enough to have an invertible D, this is a pretty mathematically convenient way to do things.

    In 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)
    
    0 讨论(0)
  • 2020-12-07 19:02

    Method #1: use None (or np.newaxis) to add an extra dimension so that broadcasting will behave:

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

    Method #2: go transpose-happy:

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

    (You can drop the axis= part for conciseness, if you want.)

    Method #3: (promoted from Jaime's comment)

    Use the keepdims argument on sum to preserve the dimension:

    >>> e/e.sum(axis=1, keepdims=True)
    array([[ 0.        ,  1.        ],
           [ 0.33333333,  0.66666667],
           [ 0.16666667,  0.83333333]])
    
    0 讨论(0)
  • 2020-12-07 19:17

    You can also use reshape method of numpy as follows:

    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]])
    
    0 讨论(0)
提交回复
热议问题