こんにちは、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])
あなたが電話した場合
arr.argsort()[:3]
3つの最小要素のインデックスが表示されます。
array([0, 2, 1], dtype=int64)
したがって、n
については、
arr.argsort()[:n]
この質問が投稿されて以来、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)で実行されます。これは、より小さい出力リストでソートが行われるためです。
これが高速になることは保証しませんが、より良いアルゴリズムはheapq
に依存します。
_import heapq
indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)
_
これはおよそO(N)
操作で機能するはずです。一方、argsort
を使用するとO(NlogN)
操作が必要になります。ただし、もう一方は高度に最適化されたCにプッシュされるため、パフォーマンスが向上する可能性があります。確実に知るには、実際のデータでいくつかのテストを実行する必要があります。
ソート結果を逆にしないでください。
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])