如何使 numpy 数组列总和为 1

How to make numpy array column sum up to 1

我正在构建用于实现 PageRank 算法的转换矩阵。我如何使用 numpy 来确保列相加为一。

例如:

1 1 1   
1 1 1  
1 1 1

应该标准化为

.33 .33 .33  
.33 .33 .33  
.33 .33 .33

将每列的元素除以它们的列总和 -

a/a.sum(axis=0,keepdims=1) # or simply : a/a.sum(0)

为了使行求和统一,改变轴输入-

a/a.sum(axis=1,keepdims=1)

样本运行-

In [78]: a = np.random.rand(4,5)

In [79]: a
Out[79]: 
array([[ 0.37,  0.74,  0.36,  0.41,  0.44],
       [ 0.51,  0.86,  0.91,  0.03,  0.76],
       [ 0.56,  0.46,  0.01,  0.86,  0.38],
       [ 0.72,  0.66,  0.56,  0.84,  0.69]])

In [80]: b = a/a.sum(axis=0,keepdims=1)

In [81]: b.sum(0) # Verify
Out[81]: array([ 1.,  1.,  1.,  1.,  1.])

要确保它在 int 数组上也适用于 Python 2.x,请使用 from __future__ import division 或使用 np.true_divide.


列加起来为 0

对于总和为 0 的列,假设我们可以将它们保持原样,我们可以将总和设置为 1,而不是除以 0,像这样 -

sums = a.sum(axis=0,keepdims=1); 
sums[sums==0] = 1
out = a/sums
for i in range(len(A[0])):
    col_sum = A[:, i].sum()
    if col_sum != 0:
        A[:, i] = A[:, i]/col_sum
    else: 
        pass

for loop 有点草率,我相信还有更优雅的方法,但它确实有效。
pass 替换为 A[:, i] = 1/len(A[0]) 以消除悬挂节点并使矩阵列随机。