Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 38

Reshaping NumPy Arrays

Recommended resources

Bonjour ! Dans la leçon précédente, vous avez appris à effectuer des opérations matricielles essentielles avec NumPy, comme le produit matriciel, la transposée et l'inverse. Ces outils sont fondamentaux pour l'algèbre linéaire qui sous-tend de nombreux algorithmes de machine learning.

Aujourd'hui, nous allons aborder une autre compétence de manipulation de tableaux absolument cruciale : le remodelage (ou "reshaping"). L'objectif de cette leçon est de vous apprendre à remodeler un tableau NumPy pour lui donner une nouvelle forme compatible. Savoir comment faire cela est indispensable, car les bibliothèques de machine learning comme Scikit-learn ou PyTorch exigent que les données que vous leur fournissez aient une forme très spécifique. Par exemple, une série de mesures doit souvent être transformée d'un simple vecteur 1D en une matrice 2D avant de pouvoir être utilisée pour entraîner un modèle.

1. Comprendre la Forme d'un Tableau (Shape & Dimensions)

Avant de pouvoir remodeler un tableau, il est essentiel de bien comprendre ce qu'est sa "forme". La forme (shape) d'un tableau NumPy décrit la taille de chacune de ses dimensions. Par exemple, un tableau avec 2 lignes et 3 colonnes a une forme de (2, 3). Le nombre de dimensions (ndim) est simplement le nombre d'éléments dans la tuple de la forme (pour (2, 3), ndim est 2).

L'image suivante illustre bien ce concept pour des tableaux à 1, 2 et 3 dimensions.

Visualisation de tableaux NumPy à 1, 2 et 3 dimensions, avec leurs axes et leur attribut `shape` correspondant.

En Python, vous pouvez inspecter ces propriétés avec les attributs .shape et .ndim.

import numpy as np




# Un tableau 2D
array_2d = np.array([[1, 2, 3], 
                     [4, 5, 6]])

print(f"Shape: {array_2d.shape}")   # Affiche (2, 3)
print(f"Dimensions: {array_2d.ndim}") # Affiche 2




# Un tableau 1D
array_1d = np.array([10, 20, 30, 40])

print(f"\nShape: {array_1d.shape}")   # Affiche (4,) - Notez la virgule
print(f"Dimensions: {array_1d.ndim}") # Affiche 1

Pour une révision de ces concepts de base, la lecture suivante est un bon point de départ.

Using NumPy reshape() to Change the Shape of an Array

Cet article de Real Python commence par expliquer clairement les concepts de forme et de dimension d'un tableau NumPy.

Lisez la section Understand the Shape. Elle vous montrera comment la même quantité de données peut être organisée sous différentes formes et dimensions.


2. Le Remodelage de Base avec reshape()

La fonction principale pour changer la forme d'un tableau est reshape(). Elle peut être utilisée de deux manières : np.reshape(mon_array, nouvelle_forme) ou, plus couramment, mon_array.reshape(nouvelle_forme).

La règle la plus importante du remodelage est que la nouvelle forme doit être compatible avec l'ancienne. Cela signifie que le nombre total d'éléments doit rester le même. Par exemple, un tableau de 12 éléments peut être remodelé en (3, 4), (4, 3), (2, 6), (6, 2), (12, 1) ou (1, 12), car dans tous les cas, le produit des dimensions est égal à 12.

La vidéo suivante vous donnera un aperçu rapide et très clair de cette opération.

Learn to reshape NumPy arrays in 4 minutes! ↔️

Cette courte vidéo de Bro Code explique le fonctionnement de reshape() en moins de 2 minutes.

Regardez comment un tableau 1D est remodelé en un tableau 2D. Portez une attention particulière à ce qui se passe lorsque la nouvelle forme est incompatible et qu'une ValueError est générée.

Voici un exemple pratique en code :




# Un tableau 1D de 12 éléments
a = np.arange(1, 13) # Crée un tableau [1, 2, ..., 12]
print("Original array (shape", a.shape, "):\n", a)




# Remodelage en un tableau 2D de 3 lignes et 4 colonnes
b = a.reshape((3, 4))
print("\nReshaped array (shape", b.shape, "):\n", b)

Le résultat sera :

Original array (shape (12,) ):
 [ 1  2  3  4  5  6  7  8  9 10 11 12]

Reshaped array (shape (3, 4) ):
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

3. Augmenter et Diminuer le Nombre de Dimensions

Le remodelage ne se limite pas à réarranger les lignes et les colonnes ; il peut aussi changer le nombre de dimensions d'un tableau.

  • Aplatir (Flattening) : Transformer un tableau N-D en un tableau 1D.
  • Augmenter les dimensions : Transformer un tableau 1D en 2D ou 3D, etc.

La lecture suivante vous guidera à travers ces scénarios avec des exemples clairs.

Using NumPy reshape() to Change the Shape of an Array

Ces sections de l'article de Real Python explorent comment utiliser reshape pour changer le nombre de dimensions d'un tableau.

Parcourez les sections suivantes : Change an Array’s Shape pour l'exemple de base. Reduce an Array’s Number of Dimensions pour voir comment passer de 2D à 1D. Increase an Array’s Number of Dimensions pour voir l'opération inverse, de 1D à 2D.


4. Le Raccourci reshape(-1, ...) : Une Astuce Indispensable

L'une des utilisations les plus courantes et puissantes de reshape est l'utilisation de -1 comme joker pour l'une des dimensions. Lorsque vous spécifiez -1, vous demandez à NumPy de calculer automatiquement la taille de cette dimension en fonction du nombre total d'éléments et des autres dimensions que vous avez fournies.

C'est extrêmement utile en machine learning. Par exemple, de nombreux modèles Scikit-learn attendent que les données d'entrée (features) soient un tableau 2D, même s'il n'y a qu'une seule feature. Si vous avez vos données dans un tableau 1D, vous obtiendrez une erreur. La solution est de le remodeler en une matrice colonne avec reshape(-1, 1).

La vidéo suivante explique parfaitement pourquoi et comment utiliser cette astuce.

What does numpy reshape(-1 1) mean?

Cette vidéo de Bhavesh Bhatt répond de manière très concrète à la question : "Que signifie numpy.reshape(-1, 1) ?"

Regardez la vidéo en entier (elle est courte). Elle commence par montrer une erreur courante lors de l'utilisation d'un modèle de régression linéaire. Ensuite, elle explique comment reshape(-1, 1) résout le problème en transformant un tableau 1D en un tableau 2D (une colonne). La conclusion résume parfaitement l'idée.

Voici l'exemple en code :




# Supposons que nous ayons une seule feature (par ex. la surface d'une maison) pour 5 maisons
feature = np.array([120, 150, 110, 200, 180])
print("Shape originale:", feature.shape) # (5,)




# Erreur si on l'utilise directement dans un modèle qui attend du 2D
# model.fit(feature, prices) -> ValueError




# La solution :
feature_reshaped = feature.reshape(-1, 1)
print("Shape remodelée:", feature_reshaped.shape) # (5, 1)
print("Tableau remodelé:\n", feature_reshaped)

Le -1 dit à NumPy : "crée autant de lignes que nécessaire pour accommoder tous les éléments, et fais une seule colonne".


5. Options Avancées : Ordre de Remodelage et Formes Incompatibles

L'ordre de lecture des données (order)

Par défaut, NumPy lit les éléments de l'ancien tableau et les écrit dans le nouveau en suivant un ordre "C" (comme le langage C), c'est-à-dire ligne par ligne. Il est aussi possible d'utiliser un ordre "F" (comme Fortran), qui procède colonne par colonne.

L'image ci-dessous illustre bien cette différence. La fonction ravel aplatit un tableau, et comme reshape, elle possède un paramètre order.

Cette image montre la différence entre l'aplatissement par défaut (ordre 'C', ligne par ligne) et l'aplatissement avec `order='F'` (colonne par colonne).

Cela devient important lorsque vous travaillez avec des données provenant de systèmes qui n'utilisent pas le même ordre de stockage en mémoire (par exemple, MATLAB ou R).

Using NumPy reshape() to Change the Shape of an Array

Cette section de l'article de Real Python explique en détail le paramètre order.

Lisez la section Control How the Data Is Rearranged Using order. Les diagrammes visuels sont particulièrement utiles pour comprendre la différence entre l'ordre en C (row-major) et l'ordre en Fortran (column-major).

Gérer les formes incompatibles

Que se passe-t-il si vous avez 200 lectures de température et que vous voulez les organiser par semaines de 7 jours, avec 8 lectures par jour ? 7 * 8 = 56. 200 n'est pas divisible par 56. reshape lèvera une erreur. Vous avez deux options :

  1. Tronquer (trim) les données pour ne garder que le plus grand nombre de semaines complètes.
  2. Étendre (extend/pad) le tableau avec des valeurs vides (comme np.nan) pour compléter la dernière semaine.

La gestion de ces cas est une compétence pratique très importante.

Using NumPy reshape() to Change the Shape of an Array

Cette section montre comment aborder les cas où un remodelage direct n'est pas possible.

Lisez la section Ensure Compatibility. Elle vous montrera concrètement comment tronquer un tableau ou l'étendre avec np.nan pour permettre le remodelage.


Exercice Pratique

Vous disposez d'un enregistrement d'activité sur 24 heures, avec une mesure prise toutes les 15 minutes. Cela vous donne un tableau 1D de 24 * 4 = 96 mesures.




# Activité enregistrée toutes les 15 minutes sur 24h
activite_1d = np.random.randint(0, 100, 96)

Votre tâche : Remodelez ce tableau 1D en un tableau 2D où chaque ligne représente une heure et chaque colonne représente une mesure de 15 minutes au sein de cette heure. Quelle sera la forme du tableau final ?


Solution




# Il y a 24 heures et 4 mesures par heure. La forme cible est (24, 4).
activite_par_heure = activite_1d.reshape(24, 4)

print("Forme du nouveau tableau :", activite_par_heure.shape)
print("Les 3 premières heures d'activité :\n", activite_par_heure[:3])

Le tableau final aura une forme de (24, 4).


Conclusion

Vous maîtrisez maintenant l'une des opérations les plus fondamentales et les plus fréquemment utilisées de NumPy. Le remodelage est la clé pour préparer vos données avant de les passer à des algorithmes d'apprentissage automatique.

Points clés à retenir :

  • reshape() change la forme d'un tableau, mais le nombre total d'éléments doit rester le même.
  • L'attribut .shape vous donne la taille des dimensions, et .ndim le nombre de dimensions.
  • Le joker -1 dans reshape() est une astuce extrêmement pratique pour laisser NumPy calculer une dimension pour vous (reshape(-1, 1) est un idiome courant).
  • Pour les formes incompatibles, vous devez décider de tronquer ou d'étendre vos données.
  • Le paramètre order ('C' ou 'F') contrôle la manière dont les données sont lues et réorganisées.

Dans la prochaine leçon, nous continuerons à explorer la manipulation de tableaux en apprenant à concaténer plusieurs tableaux NumPy le long d'un axe spécifique. C'est l'opération inverse du découpage et une autre compétence essentielle pour combiner des ensembles de données.