2017-08-22 6 views
3

サイズが〜70k * 10kの2次元numpy配列を持っています。すべての値をすべての行の "N"個の要素よりも小さいゼロで置き換えたい。例えば:各行の "n"個の最大項目より小さいnumpy配列のすべての値を置換する

arr = np.array([[1, 0, 6, 5, 2, 5], 
       [7, 5, 2, 6, 7, 3], 
       [3, 5, 1, 5, 6, 4]]) 

N = 3ため結果は次のようになります。

result = np.array([[0, 0, 6, 5, 0, 5], # 3 largest in row: 6, 5, 5 
        [7, 0, 0, 6, 7, 0], 
        [0, 5, 0, 5, 6, 0]]) 

置換されていなかった、アレイの形状は同じままべき数字の位置。

+5

あなたは何を自分でしようとしたのですか?誰かがそれをどうやってやるのかについてのアイデアは何ですか? –

+0

https://stackoverflow.com/questions/30332908/n-largest-values-in-each-row-of-ndarrayのような同様の質問がありますが、np.partitionは配列の形を変えます。それは避けなければならないことです。 –

+1

私が得た3番目のGoogleの結果は[this](https://stackoverflow.com/questions/19666626/replace-all-elements-of-python-numpy-array-that-are-greater-than-some-value)でした。 。それはあなたを始めさせるのに十分であるはずです。 –

答えて

4

あなたはnp.partitionを使用してN番目の最大値を検索し、それの行にその値「の下に」だ、すべてを置き換えるために、ブールインデックスを使用することができます。

import numpy as np 
arr = np.array([[1, 0, 6, 5, 2, 5], 
       [7, 5, 2, 6, 7, 3], 
       [3, 5, 1, 5, 6, 4]]) 

N = 3 
nlargest = np.partition(arr, -N, axis=1)[:, -N] 
arr[arr < nlargest[:, None]] = 0 
arr 
# array([[0, 0, 6, 5, 0, 5], 
#  [7, 0, 0, 6, 7, 0], 
#  [0, 5, 0, 5, 6, 0]]) 
関連する問題