2017-04-14 4 views
1

私は3列の配列を持っています。配列の最初の列は1〜10の値を持ちます。最初の列が1の行をすべて抽出し、この配列の3番目の列を正規化する必要があります。そして、最初の列に等しいされているすべての行に対して同じことを繰り返して2などndarrayのスライスをノーマライズ

私はこのコードを実行した場合、それは変わらない配列を残し:

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask][:,2]=x[mask][:,2]/np.sum((x[mask][:,2])) 

私はこのコードの他のスライスを実行する場合、私はr(私はループの中に印刷物rを置いた)が実際に私が望むのとまったく同じ働きをするのを見ます。唯一のポイントは元の配列xが変更されていないことです。

for u in np.unique(x[:,0]): 
    r = x[x[:, 0] == u] 
    r[:,2]=r[:,2]/np.sum((x[x[:,0]==u][:,2])) 

なぜですか?私は間違って何をしていますか?

答えて

1

ここnp.uniqueを使用して、あなたの問題を解決するために念頭に置いて、パフォーマンスと代替ベクトル化のアプローチだとnp.bincount - さらにパフォーマンスを向上させる

tags = np.unique(x[:,0], return_inverse=1)[1] 
x[:,2] /= np.bincount(tags, x[:,2])[tags] 

、1は使用を避けることができます第1列の数字が110の間であることを利用して、np.bincount(tags, xc[:,2])の等価を直接計算すると、t彼 - tagsを置き換えるために

np.bincount(xc[:,0].astype(int), xc[:,2], minlength=11)[1:] 

ので、同じように、私たちは、最初の列を使用することができます -

tags = xc[:,0].astype(int)-1 
+0

ありがとうございます! – user3623123

1

インデックスを2回作成しないでください。どうやら、ソース配列のコピーが作成されます。 代わりx[mask][:,2]の使用x[mask,2]

for u in np.unique(x[:,0]): 
    mask= x[:, 0] == u 
    x[mask,2]=x[mask,2]/np.sum((x[mask,2])) 
+0

あなたが正しいです。私の悪い!!!仲間ありがとう – user3623123

関連する問題