web-dev-qa-db-ja.com

numpy配列の列の合計を1にする方法

PageRankアルゴリズムを実装するための遷移行列の作成に取り組んでいます。 numpyを使用して、列の合計が1になるようにする方法を教えてください。

例えば:

1 1 1   
1 1 1  
1 1 1

正規化する必要があります

.33 .33 .33  
.33 .33 .33  
.33 .33 .33
7
Simon

各列の要素を列合計で除算します-

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

Python 2.xのint配列でも機能することを確認するには、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
12
Divakar
_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_は少しずさんで、はるかにエレガントな方法があると確信していますが、それは機能します。
passA[:, i] = 1/len(A[0])に置き換えて、ダングリングノードを削除し、行列の列を確率論的にします。

0
grofte