numpy行除以行和

2024-04-19 17:40:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 方法inimportnumpyforasnp数组
2条回答

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

方法二:快乐转置:

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

你可以用数学的方法来做。

这里,E是原始矩阵,D是对角矩阵,其中每个条目是E中相应行的和。如果你很幸运有一个可逆的D,这是一个非常方便的数学方法。

在纽比:

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)

相关问题 更多 >