np.argsort() în NumPy

Returnează indicii care ar sorta tabloul; așa sortezi un tablou după altul, de exemplu numele după note.

Sintaxă
np.argsort(a, axis=-1, kind=None, stable=None, descending=False)
a.argsort(axis=-1, ...)

Ce face np.argsort()

np.argsort() nu sortează valorile, ci returnează pozițiile lor în ordinea sortată: primul indice arată unde se află cea mai mică valoare, al doilea unde se află următoarea și așa mai departe. a[np.argsort(a)] este același lucru cu np.sort(a).

Puterea lui argsort vine când ai mai multe tablouri legate între ele: calculezi ordinea pe un tablou (notele) și aplici aceiași indici pe celălalt (numele). Pentru ordine descrescătoare inversezi indicii cu [::-1]; primele k poziții dau un „top k”.

Același truc sortează rândurile unui tablou 2D după o coloană: tabel[tabel[:, 1].argsort()].

Parametri

Parametru Descriere
a Tabloul după care se stabilește ordinea.
axis Axa de sortare; implicit ultima.
kind / stable Algoritmul sau cererea unei sortări stabile (elementele egale păstrează ordinea inițială).
descending Ordine descrescătoare (NumPy 2.5+).

Ce returnează

Un tablou de indici întregi, de aceeași formă ca a.

Exemple

Exemplul 1: Ce returnează argsort

import numpy as np

note = np.array([7, 10, 5, 9])
ordine = np.argsort(note)
print(ordine)
print(note[ordine])

Rezultat

[2 0 3 1]
[ 5  7  9 10]

Exemplul 2: Clasamentul elevilor după note

Indicii obținuți din note se aplică pe tabloul cu nume; [::-1] dă ordinea descrescătoare.

import numpy as np

nume = np.array(["Ana", "Mihai", "Ioana", "Radu", "Elena"])
medii = np.array([8.75, 9.40, 7.10, 9.90, 8.20])

ordine = np.argsort(medii)[::-1]
for loc, i in enumerate(ordine, start=1):
    print(loc, nume[i], medii[i])

print("Top 3:", nume[ordine[:3]])

Rezultat

1 Radu 9.9
2 Mihai 9.4
3 Ana 8.75
4 Elena 8.2
5 Ioana 7.1
Top 3: ['Radu' 'Mihai' 'Ana']

Exemplul 3: Sortarea rândurilor după o coloană

Fiecare rând este [cod produs, preț]; rândurile se sortează după preț și rămân întregi.

import numpy as np

produse = np.array([
    [101, 45],
    [102, 12],
    [103, 99],
    [104, 30],
])
print(produse[produse[:, 1].argsort()])

Rezultat

[[102  12]
 [104  30]
 [101  45]
 [103  99]]

Greșeli frecvente

  • Crezi că np.argsort(a) dă „locul în clasament” al fiecărui element. Dă indicii în ordinea sortată, adică altceva. Locul fiecărui element este np.argsort(np.argsort(a)).
  • Sortezi separat numele și notele cu np.sort(): legătura dintre ele se pierde. Calculează o singură ordine cu argsort și aplic-o pe ambele.

Comenzi înrudite

  • np.sort(): Sortează elementele unui tablou: np.sort returnează o copie, a.sort() sortează pe loc; ordinea descrescătoare cu [::-1].
  • np.argmax(): Returnează poziția (indicele) valorii maxime sau minime, nu valoarea; np.unravel_index transformă indicele în rând și coloană.
  • Indexare și slicing: Accesează un element, o bucată, un rând sau o coloană dintr-un tablou NumPy cu paranteze pătrate.