HOWTO · NumPy
Transposer un tableau 1D dans NumPy
Apprenez à transposer un tableau NumPy 1D en Python
Sur cette page
La transposition d’un tableau 1D dans NumPy est une source fréquente de confusion : l’appel de .T sur un ndarray unidimensionnel s’exécute sans erreur, pourtant le tableau renvoyé semble exactement identique. Pour obtenir une véritable transposition, il faut d’abord transformer le tableau 1D en vecteur ligne ou colonne 2D, puis transposer celui-ci. Cet article explique pourquoi .T laisse un tableau 1D inchangé et présente les méthodes standard pour ajouter le second axe.
Pourquoi .T laisse un tableau 1D inchangé
Un ndarray 1D a une forme (n,) : un seul axe contenant n éléments. La transposition permute l’ordre des axes d’un tableau ; avec un seul axe, il n’y a rien à permuter, donc .T renvoie les mêmes données avec la même forme. Vérifiez la forme avant et après :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(a.shape)
print(a.T.shape)
print(a.T)
Sortie :
(5,)
(5,)
[1 2 3 4 5]
La forme (5,) et les valeurs sont identiques après .T, ce qui explique pourquoi l’on dit souvent qu’un tableau 1D ne peut pas être transposé. Il est plus exact de dire que la transposition réussit, mais qu’elle est sans effet : NumPy renvoie une vue sur les mêmes données unidimensionnelles.
Gardez à l’esprit que .T est un attribut de ndarray, et non une fonctionnalité générale de Python. Une simple list ne possède pas .T ; convertissez donc les données d’une liste avec np.array() ou np.asarray() avant d’effectuer ces opérations.
Créer un vecteur ligne ou colonne
La solution pratique consiste à donner un second axe au tableau. Un vecteur ligne a la forme (1, n), un vecteur colonne a la forme (n, 1), et tous deux se transposent comme prévu. La méthode reshape produit un vecteur ligne comme suit :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
row = a.reshape(1, -1)
print(row.shape)
print(row)
Sortie :
(1, 5)
[[1 2 3 4 5]]
Le 1 fixe le nombre de lignes ; le -1 indique à NumPy de calculer le nombre de colonnes afin que les cinq éléments y trouvent tous leur place. La même ligne s’obtient avec a[np.newaxis, :], qui insère un nouvel axe au début pendant l’indexation.
Pour un vecteur colonne, inversez les arguments :
import numpy as np
a = np.array([1, 2, 3, 4, 5])
col = a.reshape(-1, 1)
print(col.shape)
print(col)
Sortie :
(5, 1)
[[1]
[2]
[3]
[4]
[5]]
La forme équivalente avec np.newaxis est a[:, np.newaxis], qui conserve l’axe existant en place et ajoute un nouvel axe de longueur 1. Notez les doubles crochets dans la sortie affichée : ils indiquent un tableau 2D, contrairement aux crochets simples d’un tableau 1D.
Comparer reshape et np.newaxis
Les deux outils ajoutent un axe sans copier les données ; le choix relève donc de la lisibilité plutôt que des performances. Les paires sont équivalentes :
a.reshape(1, -1)produit le même vecteur ligne quea[np.newaxis, :].a.reshape(-1, 1)produit le même vecteur colonne quea[:, np.newaxis].
Utilisez reshape lorsque la forme cible est l’objectif de l’appel : elle explicite les dimensions voulues et peut réorganiser plusieurs axes en une étape. Utilisez np.newaxis dans une expression d’indexation lorsque vous effectuez déjà un découpage, ou lorsque vous voulez que l’insertion de l’axe soit visible à l’endroit exact où elle se produit. Comme np.newaxis est un alias de None, l’écriture a[None, :] fonctionne de manière identique. Vous pouvez vérifier que ces paires produisent des résultats identiques :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.array_equal(a.reshape(1, -1), a[np.newaxis, :]))
print(np.array_equal(a.reshape(-1, 1), a[:, np.newaxis]))
Sortie :
True
True
Vérifier les formes et les sorties
Une fois que le tableau est en 2D, .T fait ce que la plupart des lecteurs souhaitent réellement : il transforme un vecteur ligne en vecteur colonne, et un vecteur colonne en vecteur ligne. Exécutez cette vérification complète et comparez les formes indiquées aux valeurs affichées. Les libellés de sortie de l’exemple restent en anglais :
import numpy as np
a = np.array([1, 2, 3, 4, 5])
row = a[np.newaxis, :]
col = row.T
print("a:", a.shape)
print("row:", row.shape)
print("row.T:", col.shape)
print(col)
Sortie :
a: (5,)
row: (1, 5)
row.T: (5, 1)
[[1]
[2]
[3]
[4]
[5]]
Les valeurs ne sont pas modifiées ; seul l’ordre des axes diffère. Utilisez .shape (ou .ndim) chaque fois que vous n’êtes pas sûr de l’objet que vous manipulez : une forme (5,) affichée signifie que le tableau est encore 1D et que .T le laissera tel quel, tandis que (1, 5) ou (5, 1) indique que vous avez un vecteur 2D qui peut être transposé. Cette distinction est importante pour les opérations en aval comme la multiplication matricielle et la préparation des entrées d’un modèle, qui attendent des données bidimensionnelles.