如何使 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])
以消除悬挂节点并使矩阵列随机。
我正在构建用于实现 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])
以消除悬挂节点并使矩阵列随机。