Introduction
Modifier la forme (ou reshape) d’un tableau est l’une des opérations les plus courantes lorsque l’on travaille avec NumPy. Que vous prépariez des données pour le machine learning, manipuliez des images multidimensionnelles ou réalisiez des calculs vectorisés, comprendre les formes de tableaux est essentiel.
Ce guide présente les méthodes indispensables pour examiner et modifier la forme des tableaux NumPy — avec des exemples pratiques et quelques astuces méconnues.
Obtenir la Forme et la Taille d’un Tableau NumPy
Avant de remodeler un tableau, il faut comprendre sa structure actuelle — sa shape (dimensions) et sa size (nombre total d’éléments).
1 2 3 4 | import numpy as np np.random.seed(42) data = np.random.randint(0, 100, (4, 5)) |
Ce qui produit :
1 2 3 4 | array([[51, 92, 14, 71, 60], [20, 82, 86, 74, 74], [87, 99, 23, 2, 21], [52, 1, 87, 29, 37]]) |
Vérifier la forme avec .shape
1 | data.shape |
Sortie :
1 | (4, 5) |
Vérifier le nombre d’éléments avec .size
1 | data.size |
Sortie :
1 | 20
|
Règle fondamentale :
Une opération de reshape doit conserver le nombre total d’éléments.
Par exemple :
4 × 5 = 2 × 10 = 10 × 2 = 20
Remodeler un Tableau NumPy
Utiliser .reshape()
La méthode principale pour changer les dimensions d’un tableau :
1 | reshaped_data = data.reshape((2, 10)) |
Résultat :
1 2 | array([[51, 92, 14, 71, 60, 20, 82, 86, 74, 74], [87, 99, 23, 2, 21, 52, 1, 87, 29, 37]]) |
Important : .reshape() renvoie une vue (view) lorsque c’est possible, et non une copie.
Utiliser -1 pour que NumPy devine une dimension
1 | reshaped_data = data.reshape((-1, 2)) |
Sortie :
1 2 3 4 5 6 | array([[51, 92], [14, 71], [60, 20], ... [ 1, 87], [29, 37]]) |
Mais certaines formes impossibles échouent :
1 | data.reshape((-1, 3)) |
Erreur :
1 | ValueError: cannot reshape array of size 20 into shape (3) |
Aplatir un Tableau
Transformer un tableau multidimensionnel en un tableau 1D :
1 | flat = data.flatten() |
Sortie :
1 | array([51, 92, 14, 71, 60, 20, ..., 29, 37]) |
Vous pouvez ensuite restaurer la forme :
1 | flat.reshape((4, 5)) |
Une meilleure alternative : ravel()
flatten()crée toujours une copie-
ravel()renvoie une vue lorsque possibleflat_view = data.ravel()
Plus léger en mémoire et souvent plus rapide.
Transposer un Tableau
Pour échanger lignes et colonnes :
1 | data.T |
Équivalent :
1 | data.transpose() |
Résultat :
1 2 3 4 5 | array([[51, 20, 87, 52], [92, 82, 99, 1], [14, 86, 23, 87], [71, 74, 2, 29], [60, 74, 21, 37]]) |
Manipulations Avancées des Formes
1. Ajouter ou Supprimer des Dimensions avec np.newaxis / None
Ajouter une nouvelle dimension (utile en ML) :
1 | data_3d = data[:, :, np.newaxis] # devient (4, 5, 1) |
Créer un batch de 1 échantillon :
1 | batch = data[np.newaxis, :] # forme : (1, 4, 5) |
Transformer en vecteur colonne :
1 | col = data.flatten()[:, None] # (20, 1) |
2. Utiliser swapaxes et moveaxis
Pour les tableaux multidimensionnels :
1 2 | np.swapaxes(arr, 0, 2) np.moveaxis(arr, 2, 0) |
Essentiel pour manipuler les images en format CHW vs HWC.
3. Remodelage pour les Modèles de Machine Learning
Les bibliothèques ML attendent souvent :
- une ligne = un échantillon
- une colonne = une caractéristique
Créer 20 échantillons à une seule caractéristique :
1 | X = data.reshape(-1, 1) |
Créer un échantillon unique avec 20 caractéristiques :
1 | X = data.reshape(1, -1) |
Créer des fenêtres glissantes :
1 2 | seq = np.arange(12) windows = seq.reshape(3, 4) # 3 fenêtres de taille 4 |
4. Remodeler des Images
Image RGB 100×100 :
1 | image = np.random.rand(100, 100, 3) |
Passer en format “channel-first” (PyTorch) :
1 | image_chw = image.transpose(2, 0, 1) # (3, 100, 100) |
Aplatir pour du ML :
1 | pixels = image.reshape(-1, 3) # tableau 10 000 × 3 |
5. Changer l’Ordre Mémoire (order='C' ou 'F')
Ordre ligne-major (C) vs colonne-major (Fortran) :
1 | data.reshape((2, 10), order='F') |
Critique pour interfacer avec Fortran ou MATLAB.
Résumé
| Opération | Objectif | Exemple |
|---|---|---|
shape |
Obtenir les dimensions | data.shape |
size |
Nombre total d’éléments | data.size |
reshape |
Modifier les dimensions | data.reshape((2,10)) |
reshape(-1, …) |
Dimension auto-déduite | data.reshape(-1,2) |
flatten |
Copie 1D | data.flatten() |
ravel |
Vue 1D | data.ravel() |
transpose / .T |
Permuter les axes | data.T |
newaxis |
Ajouter des dimensions | data[:, :, None] |
swapaxes, moveaxis |
Réordonner les axes | moveaxis(arr, 2, 0) |
Références
| Liens | Site |
|---|---|
| reshape | numpy.org |
| transpose | numpy.org |
| flatten | numpy.org |
| ravel | numpy.org |
| array-manipulation | numpy.org |
