2013-05-29 10 views
10

Witam Mam tablicę z wartością X wartości. Chciałbym zlokalizować indeksy dziesięciu najmniejszych wartości. W tym linku obliczyli maksymalnie efektywnie, How to get indices of N maximum values in a numpy array? , ale nie mogę komentować linków, więc muszę odesłać pytanie.Potrzebuję wartości N minimalnej (indeksowej) w tablicy numpy

Nie jestem pewien, które wskaźniki muszę zmienić, aby osiągnąć minimum, a nie wartości maksymalne. To jest ich kod

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

Odpowiedz

22

Jeśli zadzwonisz

arr.argsort()[:3] 

To daje indeksy 3 najmniejszych elementów.

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

Więc dla n, należy zadzwonić

arr.argsort()[:n] 
5

nie gwarantuje, że będzie szybciej, ale lepszy algorytm będzie polegać na heapq.

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

To powinno działać w przybliżeniu O(N) operacji podczas korzystania argsort zajęłoby O(NlogN) operacje. Jednak drugi jest popychany do wysoce zoptymalizowanego C, więc może nadal działać lepiej. Aby wiedzieć na pewno, musisz przeprowadzić testy rzeczywistych danych.

+0

o tak, to działa również. Próbowałem go używać wcześniej, ale brakowało mu trochę i było trochę skomplikowane, ale teraz działa dzięki:] – astrochris

+0

Działa również dla mnie. Jednak w moim przypadku jest to około 20 razy wolniej niż czysty numpy roztwór – embert

+0

Nie sądzę, że działa na pływaków. – darshan

2

Po prostu nie odwracaj wyników sortowania.

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

Sortowanie wg:

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

pierwszej dziesiątce:

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

Ponieważ kwestia ta została wysłana, numpy została zaktualizowana o szybszą drogę wybierając najmniejsze elementy z tablicy przy użyciu argpartition . Został po raz pierwszy zawarty w Numpy 1.8.

Korzystanie snarly's answer jako inspiracji, możemy szybko znaleźć k=3 najmniejsze elementy:

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

Będzie to działać w czasie O (n) czas, ponieważ nie trzeba zrobić pełną sortowania. Jeśli potrzebujesz odpowiedzi sortowane (Uwaga: w tym przypadku tablica wyjściowa była posortowanych ale to nie jest gwarantowane) można sortować dane wyjściowe:

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

To działa na O (n + k log k), ponieważ sortowanie odbywa się na mniejszej liście wyjściowej .

Powiązane problemy