如何将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]])
答案 0 :(得分:82)
方法#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:go transpose-happy:
>>> (e.T/e.sum(axis=1)).T
array([[ 0. , 1. ],
[ 0.33333333, 0.66666667],
[ 0.16666667, 0.83333333]])
(如果需要,您可以删除axis=
部分以简明扼要。)
方法#3 :(从Jaime的评论中提升)
使用keepdims
上的sum
参数来保留维度:
>>> e/e.sum(axis=1, keepdims=True)
array([[ 0. , 1. ],
[ 0.33333333, 0.66666667],
[ 0.16666667, 0.83333333]])
答案 1 :(得分:5)
此处,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)
答案 2 :(得分:1)
您还可以如下使用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]])