Exercice 58 / 100

NumPy — Indexation avancée

Utilise le fancy indexing et l'indexation booléenne

Au-delà du slicing classique, NumPy permet deux types d'indexation puissants :

- fancy indexing : avec une LISTE d'index - indexation booléenne : avec un masque True/False

Fancy indexing : choisir des index précis

a = np.array([10, 20, 30, 40, 50, 60, 70])
a[[0, 2, 5]] → [10 30 60] a[[0, 0, 1]] → [10 10 20] (répétitions autorisées) a[[-1, -2]] → [70 60]
# En 2D, on peut indexer ligne et colonne M = np.arange(16).reshape(4, 4) M[[0, 2], [1, 3]] → [M[0,1], M[2,3]] = [1, 11]

Indexation booléenne

Un masque = un array de booléens de même forme que les données :

a = np.array([10, 20, 30, 40, 50]) mask = a > 30 # [False False False True True] a[mask] # [40 50]
# En une ligne a[a > 30] # [40 50]

Combiner conditions avec & | ~ (parenthèses obligatoires) :

a[(a > 20) & (a < 50)] → [30 40] a[~(a > 30)] → [10 20 30] (négation)
Ce qu'on écrit entre les crochets décide de la lecture : une liste de positions va chercher les éléments un à un, une condition fabrique un masque qui garde les éléments vrais

Utilitaires matriciels utiles

np.diag(M) → vecteur des éléments diagonaux np.diag([1,2,3]) → matrice diagonale np.triu(M) → triangle supérieur (au-dessus diagonale) np.tril(M) → triangle inférieur

Exemple complet

a = np.array([10, 20, 30, 40, 50, 60, 70])
print('Fancy:', a[[0, 2, 5]]) # [10 30 60] print('Mask :', a > 30) # bool array print('Filtrés:', a[a > 30]) # [40 50 60 70]
M = np.arange(16).reshape(4, 4) print('Diagonale:', np.diag(M)) # [0 5 10 15] print('Triangle sup:\n', np.triu(M))

L'indexation booléenne est l'idiome NumPy le plus puissant pour filtrer sans boucle. C'est aussi la base du filtrage Pandas (df[df.col > 5]).

exercise.py

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →