HOWTO · NumPy
Découper un tableau 2D dans NumPy
Il existe plusieurs méthodes que nous pouvons utiliser si nous voulons découper un sous-tableau à 2 dimensions à partir d'un tableau à 2 dimensions en Python. Ces méthodes incluent l'indexation des tableaux et la fonction numpy.ix_()
Sur cette page
Un tableau NumPy peut être découpé en indiquant une expression d’indexation pour chaque axe. Utilisez des tranches classiques pour sélectionner des régions rectangulaires ou des lignes et colonnes régulièrement espacées ; utilisez des tableaux d’entiers pour choisir des intersections précises entre lignes et colonnes. Les exemples ci-dessous utilisent un tableau de 4 × 4 pour comparer directement les résultats.
Découper un tableau 2D avec l’indexation de tableaux dans NumPy
Cet exemple crée un tableau de 4 × 4 et affiche les valeurs sélectionnées.
import numpy as np
x = range(16)
x = np.reshape(x, (4, 4))
print(x)
y = x[[[0], [2]], [1, 3]]
print(y)
Résultat :
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[ 1 3]
[ 9 11]]
NumPy utilise des indices à partir de zéro : les lignes 0 et 2 sont donc les première et troisième lignes, et les colonnes 1 et 3 sont les deuxième et quatrième colonnes. Dans x[[[0], [2]], [1, 3]], le tableau d’indices des lignes a la forme (2, 1) et celui des colonnes, la forme (2,). La diffusion combine chaque ligne demandée avec les deux colonnes, ce qui produit les quatre intersections affichées dans y.
Pour sélectionner une région rectangulaire, utilisez une tranche sur chaque axe. Par exemple, x[0:2, 0:2] sélectionne les deux premières lignes et les deux premières colonnes ; x[2:, 2:] commence à la ligne 2 et à la colonne 2, puis va jusqu’à la fin de chaque axe. La borne de fin d’une tranche est exclue : 0:2 comprend donc les indices 0 et 1. Un pas permet de sélectionner des positions régulièrement espacées : x[0::2, 1::2] prend les lignes 0 et 2, ainsi que les colonnes 1 et 3. Une tranche de base renvoie généralement une vue de x, tandis que l’indexation par tableau d’entiers renvoie une copie.
La notation générale d’une tranche est start:stop:step. Vous pouvez omettre start ou stop pour commencer au bord de l’axe ou continuer jusqu’à son extrémité ; le pas vaut 1 par défaut. Dans un tableau à deux dimensions, l’expression avant la virgule désigne les lignes et celle après la virgule, les colonnes. En gardant une tranche par axe, vous pouvez facilement adapter la sélection à un tableau d’une autre forme ; vérifiez séparément les bornes de chaque axe lorsque vous les modifiez.
Utilisez des tableaux d’entiers lorsque les positions souhaitées sont énumérées explicitement plutôt que définies par un intervalle régulier. Dans cet exemple, la liste de lignes imbriquée donne aux indices une forme de colonne, ce qui leur permet de se diffuser avec la liste de colonnes et de former toutes les intersections demandées. Si les deux tableaux d’indices ont plutôt des formes unidimensionnelles identiques, NumPy associe leurs éléments un à un. Utilisez numpy.ix_() dans la section suivante lorsque vous voulez combiner chaque ligne avec chaque colonne.
Découper un tableau 2D avec la fonction numpy.ix_() de NumPy
Utilisez numpy.ix_() lorsque vous disposez de listes distinctes d’indices de lignes et de colonnes et souhaitez en obtenir toutes les combinaisons. La fonction remodèle les séquences d’indices unidimensionnelles en tableaux qui se diffusent pour former un produit cartésien lors de l’indexation multidimensionnelle.
import numpy as np
x = range(16)
x = np.reshape(x, (4, 4))
print(x)
y = x[np.ix_([0, 2], [1, 3])]
print(y)
Résultat :
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[ 1 3]
[ 9 11]]
Ici, numpy.ix_() reçoit les lignes [0, 2] et les colonnes [1, 3] ; le résultat contient donc les mêmes quatre intersections que l’exemple avec les tableaux d’indices appariés. Cette forme rend explicite l’intention de former un produit cartésien et convient lorsque les listes d’indices sont préparées séparément. Cette sélection et celle avec les tableaux d’entiers appariés utilisent toutes deux l’indexation avancée et renvoient donc des copies. Modifier l’un ou l’autre de ces résultats n’actualise pas x ; une tranche de base telle que x[0:2, 0:2] partage généralement ses données avec le tableau d’origine. Choisissez la forme qui correspond à la façon dont vos indices de lignes et de colonnes sont représentés.