Zasadniczo musisz zrobić argsort
, to jakiej implementacji potrzebujesz, jeśli chcesz korzystać z zewnętrznych bibliotek (np. NumPy) lub jeśli chcesz pozostać czystym Pythonem bez zależności.
Pytanie, które musisz sobie zadać, brzmi: czy chcesz
- indeksy, które posortowałyby tablicę / listę
- indeksy, które elementy miałyby w posortowanej tablicy / liście
Niestety przykład w pytaniu nie wyjaśnia, co jest pożądane, ponieważ oba dają ten sam rezultat:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Wybierając argsort
implementacji
Jeśli masz do dyspozycji NumPy, możesz po prostu użyć funkcji numpy.argsort
lub metody numpy.ndarray.argsort
.
Wdrożenie bez NumPy zostało już wspomniane w kilku innych odpowiedziach, więc po prostu podsumuję najszybsze rozwiązanie zgodnie z odpowiedzią testu porównawczego tutaj
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Uzyskiwanie wskaźników, które posortowałyby tablicę / listę
Aby uzyskać indeksy, które posortowałyby tablicę / listę, możesz po prostu wywołać argsort
tablicę lub listę. Używam tutaj wersji NumPy, ale implementacja Pythona powinna dawać takie same wyniki
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Wynik zawiera indeksy potrzebne do uzyskania posortowanej tablicy.
Ponieważ posortowana tablica byłaby tablicą [1, 2, 3, 4]
argsortowaną, zawiera indeksy tych elementów w oryginale.
- Najmniejszą wartością jest
1
i jest w indeksie 1
w oryginale, więc pierwszym elementem wyniku jest1
.
2
Jest indeksem 2
w oryginale więc drugi element wyniku jest 2
.
3
Jest indeksem 0
w oryginale więc trzeci element wyniku jest 0
.
- Największa wartość
4
i jest w indeksie 3
w oryginale, więc ostatnim elementem wyniku jest 3
.
Uzyskiwanie indeksów, które elementy miałyby w posortowanej tablicy / liście
W takim przypadku należy złożyć argsort
dwukrotnie wniosek :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
W tym przypadku :
- pierwszym elementem oryginału jest
3
, co jest trzecią co do wielkości wartością, więc miałby indeks 2
w posortowanej tablicy / liście, więc pierwszym elementem jest2
.
- drugim elementem oryginału jest
1
, która jest najmniejszą wartością, więc miałby indeks 0
w posortowanej tablicy / liście, więc drugim elementem jest 0
.
- trzecim elementem oryginału jest
2
, co jest drugą najmniejszą wartością, więc miałby indeks 1
w posortowanej tablicy / liście, więc trzeci element to 1
.
- czwartym elementem oryginału jest
4
największa wartość, więc miałby indeks 3
w posortowanej tablicy / liście, więc ostatnim elementem jest 3
.