2013-04-24 21 views
7

numpyの配列から任意に多くのnanおよび/またはinfの値を持つことができる10の最小の実数値を見つけるための良い、迅速な方法が必要です。numpyの配列からinfとnanを無視して最小のN値を取得する

値自体ではなく、これらの最小の実数値のインデックスを特定する必要があります。

私はargminnanargmin numpyの関数を見つけました。彼らは実際に仕事をしているわけではありません。私はまた、例えば100の最小値が必要なように、1つ以上の値を指定したいからです。また、配列に配列が存在する場合には、両方とも-infの値を最小値として返します。

heapq.nsmallest種類の作品ですが、最小値としてnan-infも返します。また、それは私に私が探している指標を与えるものでもありません。

ここにお手伝いいただければ幸いです。

+0

配列をコピー/にわたり反復、すべてのNaNを変換し、最小のN値を得るためにあなたの関数を実行INFに-inf、古いコピーに戻す/それらをバックに変換?愚かなハッキーですが、うーん... – Patashu

+0

私は簡単な答えを得ることができない場合は、私がしなければならないことは、助けてくれてありがとう。 –

答えて

10

これを捨てるべき唯一の値は、無限の負の値です。だから、試してみてください。

import numpy as np 
a = np.random.rand(20) 
a[4] = -np.inf 
k = 10 
a[np.isneginf(a)] = inf 
result = a[np.argsort(a)[:k]] 
+1

'2 * np.max'はすべての要素が負であれば動作しません。' inf'を使うほうが良いと思います。 – interjay

+0

ええ、私はちょうどそれをinfcomした –

+0

はい、良い点.. – YXD

1

は、あなたがこのようinfNanのインデックスを見つけることができます:

​​

すなわち:

a=np.array([[12,12,111],[np.inf,np.inf,1,2,3],[np.nan,7,8]]) 

あなたはaをループして、でそれを確認することができます

In [17]: (np.isnan(a[2])) 
Out[17]: array([ True, False, False], dtype=bool) 

In [18]: (np.isnan(a[2])).nonzero() 
Out[18]: (array([0]),) 
2

元の配列を変更しようとする代わりに、ソートされた配列の最初のnの有限値を取ることができたようです。これは危険である可能性があります。

n = 10 
b = np.sort(a) 
smalls = b[np.isfinite(b)][n:] 
関連する問題