2013-05-29 4 views
10

안녕하세요, 나는 값이 X 값이있는 배열을 10 개의 가장 작은 값의 인덱스를 찾으려면 싶습니다. 이 링크에서 그들은 최대를 효과적으로 계산했습니다. How to get indices of N maximum values in a numpy array? 그러나 링크에 대한 코멘트는 아직 없으므로 질문을 다시 게시해야합니다.numpy 배열에 N 최소 (인덱스) 값이 필요합니다.

최대 값이 아닌 최소값을 얻기 위해 어느 인덱스를 변경해야하는지 잘 모르겠습니다. 이것은 당신이

arr.argsort()[:3] 

그것은 당신에게 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를 들어, 내가이 더 빨리 될 것이라고 보장하지 않습니다

arr.argsort()[:n] 
5

를 호출해야하지만, 더 나은 알고리즘heapq에 의존하는 것이다. argsort를 사용하여 O(NlogN) 작업을 것입니다 반면

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

이 약 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에서 실행하면 출력을 정렬 할 수 있습니다 : 당신이 필요로하는 경우 응답 (출력 배열이 정렬 된 순서였다이 경우하지만이 보장되지 주) 분류) 정렬은 작은 출력 목록에서 이루어지기 때문입니다.