65

如何将 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]])
4

3 回答 3

121

方法#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:转置快乐:

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

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

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

使用keepdims参数 onsum保留维度:

>>> e/e.sum(axis=1, keepdims=True)
array([[ 0.        ,  1.        ],
       [ 0.33333333,  0.66666667],
       [ 0.16666667,  0.83333333]])
于 2013-04-24T21:25:06.553 回答
6

你可以在数学上做到这一点在此处输入图像描述

在这里,E是您的原始矩阵,并且D是一个对角矩阵,其中每个条目是 中相应行的总和E。如果你有幸拥有一个 invertible 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)
于 2016-06-24T16:38:32.567 回答
2

您还可以使用 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]])
于 2020-07-15T17:07:35.733 回答