如何将数值数组行除以该行中所有值的总和?
这是一个例子。但我很确定有一种更花哨、更有效的方法:
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]])
发布于 2013-04-24 21:25:07
方法#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的评论中提升)
在sum
上使用keepdims
参数保留维度:
>>> e/e.sum(axis=1, keepdims=True)
array([[ 0. , 1. ],
[ 0.33333333, 0.66666667],
[ 0.16666667, 0.83333333]])
发布于 2016-06-24 16:38:33
你可以在数学上这样做
。
这里,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)
发布于 2020-07-15 17:07:36
您也可以使用numpy的重塑方法,如下所示:
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]])
https://stackoverflow.com/questions/16202348
复制