Indexare cu liste de indici în NumPy

Selectează mai multe elemente, rânduri sau coloane deodată, dând o listă de poziții (fancy indexing).

Sintaxă
a[[i1, i2, ...]]
a[[r1, r2], :]
a[:, [c1, c2]]
a[[r1, r2], [c1, c2]]

Ce face Indexare cu liste de indici

În loc de un singur indice poți da o listă (sau un tablou) de indici: a[[0, 2, 5]] ia elementele de pe pozițiile 0, 2 și 5, în ordinea din listă. Indicii se pot repeta și pot fi în orice ordine.

La un tablou 2D, a[[0, 2]] selectează rândurile 0 și 2, iar a[:, [1, 0]] coloanele 1 și 0. Cu două liste, a[[0, 1], [2, 0]] ia perechi de coordonate: elementele a[0, 2] și a[1, 0].

Spre deosebire de slicing, rezultatul este întotdeauna o copie.

Parametri

Parametru Descriere
listă de indici Listă sau tablou de întregi; negativii numără de la final.

Ce returnează

Un tablou nou (copie), cu forma dată de forma listei de indici.

Exemple

Exemplul 1: Elemente alese și reordonate

import numpy as np

orase = np.array(["Iași", "Cluj", "Brașov", "Timișoara", "Constanța"])
print(orase[[0, 2, 4]])
print(orase[[4, 0]])
print(orase[[1, 1, 1]])

Rezultat

['Iași' 'Brașov' 'Constanța']
['Constanța' 'Iași']
['Cluj' 'Cluj' 'Cluj']

Exemplul 2: Rânduri, coloane și perechi

import numpy as np

vanzari = np.array([[120, 95, 130],
                    [80, 110, 105],
                    [60, 70, 90]])

print(vanzari[[0, 2]])
print(vanzari[:, [2, 0]])
print(vanzari[[0, 1, 2], [2, 0, 1]])

Rezultat

[[120  95 130]
 [ 60  70  90]]
[[130 120]
 [105  80]
 [ 90  60]]
[130  80  70]

Exemplul 3: Rezultatul este o copie

import numpy as np

note = np.array([9, 7, 10, 8])
alese = note[[0, 1]]
alese[0] = 1
print(note)
print(alese)

Rezultat

[ 9  7 10  8]
[1 7]

Greșeli frecvente

  • Scrii indicii fără lista interioară: a[0, 2] pe un tablou 1D dă IndexError, pentru că se interpretează ca rând și coloană. Corect: a[[0, 2]].
  • Aștepți ca a[[0, 1], [0, 1]] să dea un sub-tabel 2 x 2. Dă doar elementele a[0, 0] și a[1, 1]; pentru sub-tabel folosește a[[0, 1]][:, [0, 1]] sau a[np.ix_([0, 1], [0, 1])].
  • Atribui pe rezultatul unei selecții cu listă crezând că schimbi tabloul (b = a[[0, 1]]; b[0] = 5). Atribuie direct: a[[0, 1]] = 5.

Comenzi înrudite

  • Indexare și slicing: Accesează un element, o bucată, un rând sau o coloană dintr-un tablou NumPy cu paranteze pătrate.
  • Măști booleene: Selectează elementele care îndeplinesc o condiție, cu un tablou de True/False pus între paranteze pătrate.
  • Copie și vedere (copy vs view): Explică diferența dintre o vedere (aceleași date) și o copie în NumPy și cum le recunoști cu .base și np.shares_memory.
  • np.argsort(): Returnează indicii care ar sorta tabloul; așa sortezi un tablou după altul, de exemplu numele după note.