我正在构建用于实现PageRank算法的转换矩阵。我怎么能使用numpy来确保列加起来。
例如:
1 1 1
1 1 1
1 1 1
应该标准化为
.33 .33 .33
.33 .33 .33
.33 .33 .33
答案 0 :(得分:9)
按列总结划分每列的元素 -
a/a.sum(axis=0,keepdims=1) # or simply : a/a.sum(0)
要使行总和为1,请更改轴输入 -
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
答案 1 :(得分:0)
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])
以消除悬空节点并使矩阵列更加稳定。