Dziwię się, że to konkretne pytanie nie zostało wcześniej zadane, ale tak naprawdę nie znalazłem go w SO ani w dokumentacji np.sort
.
Powiedzmy, że mam losową tablicę numpy zawierającą liczby całkowite, np:
> temp = np.random.randint(1,10, 10)
> temp
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])
Jeśli je posortuję, domyślnie otrzymuję kolejność rosnącą:
> np.sort(temp)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])
ale chcę, aby rozwiązanie zostało posortowane w porządku malejącym .
Teraz wiem, że zawsze mogę:
reverse_order = np.sort(temp)[::-1]
ale czy to ostatnie stwierdzenie jest skuteczne ? Czy nie tworzy kopii w kolejności rosnącej, a następnie odwraca tę kopię, aby uzyskać wynik w odwróconej kolejności? Jeśli tak jest, czy istnieje skuteczna alternatywa? Nie wygląda na to, że np.sort
akceptuje parametry, aby zmienić znak porównań w operacji sortowania, aby uzyskać rzeczy w odwrotnej kolejności.
temp[::-1].sort()
wiadomo, że musi sortować w odwrotnej kolejności? Sposób, w jaki to czytam, jest: odwróć oryginalną tablicę, a następnie posortuj ją (w porządku rosnącym). Dlaczego odwrócenie oryginalnej tablicy (w kolejności losowej), a następnie posortowanie jej w porządku rosnącym zwróci tablicę w kolejności odwrotnej?[::-1]
prostu mówi numpy, aby wykonał iterację po tablicy od tyłu, zamiast faktycznie zmieniać kolejność tablicy. Więc kiedy ma miejsce sortowanie na miejscu, w rzeczywistości sortuje w porządku rosnącym i przesuwa bity dookoła, ale pozostawia nietkniętą część iteracji wstecz.a=np.array((...))
idiomema[::-1]
niczego nie odwraca, to po prostu nowe spojrzenie na te same dane, a dokładniej widok lustrzany. Metodaa[::-1].sort()
działa na lustrzanym obrazie , co oznacza, że gdysort
przesuwa się w lewo mniejszy element w jego lustrzanym obrazie, w rzeczywistości przesuwa go w prawo w rzeczywistym bloku pamięcia
tablicy. Widok lustrzany jest sortowany w porządku rosnącym, dane rzeczywiste są sortowane w porządku malejącym. Wypróbuj sam w domu, używając różnych monet i lustra!np.sort(temp,order='descending')
a nie wymagający tego rodzaju hackówźródło
axis
do czegonp.sort
została zastosowana, nie jest konieczna.np.sort(temp)[::-1]
tego, że umieszczanan
s z tyłu tablicy zamiast z przodu. To, czy to dobrze, czy źle, jest przedmiotem dyskusji ..W przypadku krótkich tablic sugeruję użycie
np.argsort()
, znajdując indeksy posortowanej tablicy zanegowanej, co jest nieco szybsze niż odwracanie posortowanej tablicy:źródło
a[np.argsort(-a)]
jest prawdopodobnie najlepszym podejściem do innych na tej stronie. Brak zmiany o 1 krok i jeden znak minus mniej do przemyślenia.Niestety, gdy masz złożoną tablicę,
np.sort(temp)[::-1]
działa tylko poprawnie. Dwie inne wymienione tutaj metody nie są skuteczne.źródło
Uważaj na wymiary.
Pozwolić
Full Reverse
flip
zmienione1.15
, wymagane są poprzednie wersje . Rozwiązanie: .1.14
axis
pip install --upgrade numpy
Odwrócony pierwszy wymiar
Drugi wymiar odwrócony
Testowanie
Testowanie na tablicy 100 × 10 × 10 1000 razy.
Wynika to głównie z ponownego indeksowania, a nie
argsort
.źródło
Witam Szukałem rozwiązania odwrotnego sortowania dwuwymiarowej tablicy numpy i nie mogłem znaleźć niczego, co działałoby, ale wydaje mi się, że natknąłem się na rozwiązanie, które przesyłam na wypadek, gdyby ktoś był na tej samej łodzi.
np.sort sortuje rosnąco, co nie jest tym, czego chcesz, ale polecenie fliplr odwraca wiersze od lewej do prawej! Wydaje się działać!
Mam nadzieję, że ci to pomoże!
Wydaje mi się, że jest to podobne do sugestii dotyczącej -np.sort (-a) powyżej, ale odstraszył mnie komentarz, że nie zawsze działa. Być może moje rozwiązanie też nie zawsze będzie działać, jednak przetestowałem je z kilkoma tablicami i wydaje się, że jest w porządku.
źródło
Możesz najpierw posortować tablicę (domyślnie rosnąco), a następnie zastosować np.flip () ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html )
FYI Działa również z obiektami datetime.
Przykład:
źródło
x = np.array([2,3,np.nan,1,0])
tonp.flip(np.sort(x))
podejście daje [nan 3. 2. 1. 0.], podczas gdy-np.sort(-x)
podejście daje [3. 2. 1. 0. nan].Oto krótka sztuczka
źródło
sugeruję użycie tego ...
na przykład:
Następnie twój resault:
źródło
np.arange(20-0.5, 10-0.5, -0.5)
. Ale to inna historia i może być dyskusyjna ze względu na gorszą czytelność. Tablica wejściowa nie jest w ogóle posortowana