2013-05-29 17 views
10

こんにちは、私は値がXの配列を持っていますが、10個の最小値のインデックスを探したいと思います。このリンクでは、彼らは最大限効果的に計算されました。How to get indices of N maximum values in a numpy array? しかし、私はまだリンクにコメントを書くことはできませんので、質問を再投稿する必要があります。numpyの配列にN個の最小(インデックス)値が必要です

最小値ではなく最大値を達成するためにどのインデックスを変更する必要があるかわかりません。 あなたはそれがあなたに3つの最小の要素のインデックスを与える

arr.argsort()[:3] 

を呼び出す場合はこれが彼らのコード

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]) 

答えて

22

です。

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

ので、nのために、私はこれが速くなることを保証するものではありませんが、より良いアルゴリズムheapqに依存しているでしょう

arr.argsort()[:n] 
5

を呼び出す必要があります。

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

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

+0

ええ、これも同様です。私は前にそれを使いこなそうとしましたが、いくつか欠けていて少し複雑でしたが、今は感謝しています:] – astrochris

+0

私のためにも働きます。しかし、私の場合、それは純粋なnumpyのソリューションより約20倍遅いです。 – embert

+0

私は浮動小数点のために動作するとは思わない。 – darshan

2

並べ替えの結果を逆にしないでください。

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.873, 
     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:

この質問が投稿されましたので、numpyのは argpartitionを使用して配列から最小の要素を選択するより高速な方法を含むように更新してい
In [168]: a.argsort()[:10] 
Out[168]: array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2]) 
10

。これはNumpy 1.8に最初に組み込まれました。インスピレーションとして、我々はすぐにk=3最小の要素を見つけることができますsnarly's answer使用

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)の時間。 (N + k個のログK

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

これはOで実行されます:あなたは出力をソートすることができます:あなたが必要な場合は、あなたの答えは(出力配列のソート順にしたこのケースでが、それは保証されません注)ソート)ソートは小さいリスト の出力リストで行われるためです。

関連する問題