HOWTO · NumPy

Comment obtenir une colonne d'un tableau NumPy

Sélectionnez une ou plusieurs colonnes d'un tableau NumPy à deux dimensions, conservez la forme requise, filtrez les lignes et choisissez entre une vue et une copie.

Sur cette page

Pour sélectionner une colonne dans un tableau NumPy à deux dimensions, utilisez array[:, column_index]. Les deux-points sélectionnent toutes les lignes et l’entier désigne une colonne avec une indexation commençant à zéro. Par exemple, data[:, 1] renvoie la deuxième colonne sous forme de tableau unidimensionnel. Utilisez plutôt data[:, 1:2] lorsque la suite du code exige un résultat bidimensionnel de forme (rows, 1).

Sélectionner une colonne et contrôler sa forme

NumPy indexe un tableau 2D sous la forme array[row_selection, column_selection]. Omettre la virgule modifie l’opération : data[:][1] crée d’abord un slice complet, puis sélectionne la ligne 1. Cette expression ne sélectionne donc pas la colonne 1.

L’exemple suivant couvre les cas courants de sélection de colonnes dans un programme reproductible :

import numpy as np

data = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

second = data[:, 1]
second_2d = data[:, 1:2]
adjacent = data[:, :2]
reordered = data[:, [2, 0]]
taken = np.take(data, [0, 2], axis=1)
filtered = data[data[:, 0] >= 20, 2]

print("second:", second, second.shape)
print("second_2d:\n", second_2d, second_2d.shape)
print("adjacent:\n", adjacent)
print("reordered:\n", reordered)
print("taken:\n", taken)
print("filtered:", filtered)

view = data[:, 1]
copy = data[:, 1].copy()
view[0] = 99
print("data after view edit:\n", data)
print("copy:", copy)

Sortie :

second: [11 21 31] (3,)
second_2d:
 [[11]
 [21]
 [31]] (3, 1)
adjacent:
 [[10 11]
 [20 21]
 [30 31]]
reordered:
 [[12 10]
 [22 20]
 [32 30]]
taken:
 [[10 12]
 [20 22]
 [30 32]]
filtered: [22 32]
data after view edit:
 [[10 99 12]
 [20 21 22]
 [30 31 32]]
copy: [11 21 31]

Un indice de colonne entier supprime cet axe, ce qui explique la forme (3,) de second. Un slice à un seul élément conserve l’axe et produit la forme (3, 1) de second_2d. Cette distinction est importante lorsqu’une API attend une entrée semblable à une matrice plutôt qu’un vecteur plat.

Sélectionner plusieurs colonnes

Utilisez un slice tel que data[:, :2] pour des colonnes adjacentes. Le slicing exprime une plage continue et produit généralement une vue. Pour des colonnes non adjacentes ou un ordre personnalisé, fournissez une liste d’indices : data[:, [2, 0]]. Il s’agit d’une indexation avancée qui produit une copie plutôt qu’une vue.

Une liste d’indices conserve toujours l’axe des colonnes. Ainsi, data[:, [1]] a la forme (3, 1), tandis que data[:, 1] a la forme (3,). Une liste peut aussi répéter une colonne ou modifier sa position ; validez donc les indices fournis dynamiquement si des doublons ou leur ordre risquent d’être inattendus. Utilisez un slice lorsque les colonnes forment une plage simple et une liste d’indices lorsque la sélection est elle-même une séquence.

np.take est une solution de remplacement qui rend l’axe explicite. np.take(data, [0, 2], axis=1) sélectionne les colonnes 0 et 2 ; axis=1 est indispensable, car les colonnes occupent le deuxième axe. Cette fonction est particulièrement utile lorsque l’axe ou les indices sont stockés dans des variables.

Filtrer les lignes avant de lire une colonne

Une condition booléenne identifie normalement des lignes, et non des colonnes. Construisez le masque de lignes à partir d’une colonne, puis placez la colonne de sortie souhaitée après la virgule. Dans l’exemple, data[:, 0] >= 20 conserve les deux dernières lignes et data[data[:, 0] >= 20, 2] renvoie [22 32] depuis la colonne 2. La longueur du masque doit correspondre au nombre de lignes.

Choisir entre une vue et une copie

Selon les règles d’indexation de NumPy, le slicing de base renvoie une vue lorsque cela est possible, tandis que l’indexation avancée renvoie une copie. Par conséquent, une affectation par l’intermédiaire de view = data[:, 1] peut modifier data, comme le montre la valeur 99 dans la sortie. Appelez .copy() lorsque la colonne extraite doit être indépendante. Les valeurs copiées restent [11 21 31] après que la vue a modifié le tableau source.

Ces vues maintiennent également la mémoire de leur tableau de base accessible. Copiez une petite colonne si la conservation d’un grand tableau source gaspillerait de la mémoire une fois que le reste de cette source n’est plus nécessaire.

Vérifier les dimensions et les limites des colonnes

Ces expressions supposent un tableau 2D. Un tableau 1D n’a pas d’axe de colonnes ; array[:, 0] provoque donc une erreur d’indexation. Vérifiez array.ndim == 2 lorsque la forme de l’entrée est incertaine. Pour un tableau 2D, les indices de colonne non négatifs valides vont de 0 à array.shape[1] - 1 ; un indice en dehors de cette plage provoque une IndexError. Les indices négatifs sont également valides dans les limites : array[:, -1] sélectionne ainsi la dernière colonne.