web-dev-qa-db-ja.com

numpy配列にN個の最小(インデックス)値が必要です

こんにちは、X個の値を持つ配列があり、10個の最小値のインデックスを見つけたいと思います。このリンクでは、最大値を効果的に計算しました numpy配列でN個の最大値のインデックスを取得する方法? ただし、リンクについてはまだコメントできないため、質問を再投稿する必要があります。

最大値ではなく最小値を達成するために、どのインデックスを変更する必要があるのか​​わかりません。これは彼らのコードです

In [1]: import numpy as np

In [2]: arr = np.array([1, 3, 2, 4, 5])

In [3]: arr.argsort()[-3:][::-1]
Out[3]: array([4, 3, 1]) 
18
astrochris

あなたが電話した場合

arr.argsort()[:3]

3つの最小要素のインデックスが表示されます。

array([0, 2, 1], dtype=int64)

したがって、nについては、

arr.argsort()[:n]
33
petrichor

この質問が投稿されて以来、numpyは argpartition を使用して配列から最小要素を選択するより高速な方法を含むように更新されました。 Numpy 1.8に最初に含まれました。

Snarly's answer をインスピレーションとして使用すると、k=3最小要素:

In [1]: import numpy as np

In [2]: arr = np.array([1, 3, 2, 4, 5])

In [3]: k = 3

In [4]: ind = np.argpartition(arr, k)[:k]

In [5]: ind
Out[5]: array([0, 2, 1])

In [6]: arr[ind]
Out[6]: array([1, 2, 3])

これは、O(n)時間で実行されます。完全なソートを行う必要がないためです。回答をソートする必要がある場合は、(注:この場合、出力配列はソートされた順序でしたが、それは保証されていません)出力をソートできます:

In [7]: sorted(arr[ind])
Out[7]: array([1, 2, 3])

これはO(n + k log k)で実行されます。これは、より小さい出力リストでソートが行われるためです。

16
Alex

これが高速になることは保証しませんが、より良いアルゴリズムheapqに依存します。

_import heapq
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)
_

これはおよそO(N)操作で機能するはずです。一方、argsortを使用するとO(NlogN)操作が必要になります。ただし、もう一方は高度に最適化されたCにプッシュされるため、パフォーマンスが向上する可能性があります。確実に知るには、実際のデータでいくつかのテストを実行する必要があります。

6
mgilson

ソート結果を逆にしないでください。

In [164]: a = numpy.random.random(20)

In [165]: a
Out[165]: 
array([ 0.63261763,  0.01718228,  0.42679479,  0.04449562,  0.19160089,
        0.29653725,  0.93946388,  0.39915215,  0.56751034,  0.33210873,
        0.17521395,  0.49573607,  0.84587652,  0.73638224,  0.36303797,
        0.2150837 ,  0.51665416,  0.47111993,  0.79984964,  0.89231776])

ソート済み:

In [166]: a.argsort()
Out[166]: 
array([ 1,  3, 10,  4, 15,  5,  9, 14,  7,  2, 17, 11, 16,  8,  0, 13, 18,
       12, 19,  6])

最初の10:

In [168]: a.argsort()[:10]
Out[168]: array([ 1,  3, 10,  4, 15,  5,  9, 14,  7,  2])
2
Mike Müller