
Pour transposer le tableau NumPy ndarray (permuter les lignes et les colonnes), utilisez l’attribut T (.T), la méthode ndarray transpose() et la fonction numpy.transpose().
Avec ndarray.transpose() et numpy.transpose(), vous pouvez non seulement transposer un tableau 2D (matrice), mais également réorganiser les axes d’un tableau multidimensionnel dans n’importe quel ordre.
Cet article décrit le contenu suivant.
- Transposer un tableau à deux dimensions (matrice)
- Attribut T
- ndarray.transpose()
- np.transposer()
- Tableau 1D et vecteur ligne, vecteur colonne
- Permuter les axes d’un tableau multidimensionnel (3D ou supérieur)
- Résultat par défaut
- Spécifiez l’ordre des axes avec transpose()
- Exemple : transposer plusieurs matrices à la fois
Si vous souhaitez échanger des lignes et des colonnes de pandas.DataFrame ou une liste à deux dimensions (liste de listes), consultez l’article suivant.
Transposer un tableau à deux dimensions (matrice)
Attribut T
Vous pouvez obtenir la matrice transposée du tableau à deux dimensions d’origine (matrice) avec l’attribut T.
import numpy as np
a_2d = np.arange(6).reshape(2, 3)
print(a_2d)
# [[0 1 2]
# [3 4 5]]
a_2d_T = a_2d.T
print(a_2d_T)
# [[0 3]
# [1 4]
# [2 5]]
L’attribut T renvoie une vue du tableau d’origine et la modification de l’un modifie l’autre.
Vous pouvez vérifier si ndarray fait référence à des données dans la même mémoire avec np.shares_memory().
print(np.shares_memory(a_2d, a_2d_T))
# True
a_2d_T[0, 1] = 100
print(a_2d_T)
# [[ 0 100]
# [ 1 4]
# [ 2 5]]
print(a_2d)
# [[ 0 1 2]
# [100 4 5]]
a_2d[1, 0] = 3
print(a_2d)
# [[0 1 2]
# [3 4 5]]
print(a_2d_T)
# [[0 3]
# [1 4]
# [2 5]]
Si vous voulez le traiter comme des données séparées, faites une copie avec copy().
a_2d_T_copy = a_2d.T.copy()
print(a_2d_T_copy)
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, a_2d_T_copy))
# False
a_2d_T_copy[0, 1] = 100
print(a_2d_T_copy)
# [[ 0 100]
# [ 1 4]
# [ 2 5]]
print(a_2d)
# [[0 1 2]
# [3 4 5]]
ndarray.transpose()
transpose() est fourni comme méthode de ndarray. Comme T, la vue est renvoyée.
print(a_2d.transpose())
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, a_2d.transpose()))
# True
np.transposer()
La fonction numpy.transpose() est également fournie. Spécifiez le tableau d’origine au premier argument. Cela renvoie également une vue.
print(np.transpose(a_2d))
# [[0 3]
# [1 4]
# [2 5]]
print(np.shares_memory(a_2d, np.transpose(a_2d)))
# True
Tableau 1D et vecteur ligne, vecteur colonne
L’application de T ou transpose() à un tableau unidimensionnel ne renvoie qu’un tableau équivalent au tableau d’origine.
a_1d = np.arange(3)
print(a_1d)
# [0 1 2]
print(a_1d.T)
# [0 1 2]
print(a_1d.transpose())
# [0 1 2]
print(np.transpose(a_1d))
# [0 1 2]
Une matrice avec une seule ligne est appelée un vecteur ligne et une matrice avec une colonne est appelée un vecteur colonne, mais il n’y a pas de distinction entre les lignes et les colonnes dans un tableau unidimensionnel de ndarray.
Un tableau à deux dimensions est utilisé pour indiquer clairement que seules des lignes ou des colonnes sont présentes.
Ici, transformez la forme en utilisant reshape().
a_row = a_1d.reshape(1, -1)
print(a_row)
# [[0 1 2]]
print(a_row.shape)
# (1, 3)
print(a_row.ndim)
# 2
a_col = a_1d.reshape(-1, 1)
print(a_col)
# [[0]
# [1]
# [2]]
print(a_col.shape)
# (3, 1)
print(a_col.ndim)
# 2
Comme mentionné ci-dessus, les tableaux à deux dimensions peuvent être transposés.
print(a_row.T)
# [[0]
# [1]
# [2]]
print(a_col.T)
# [[0 1 2]]
Permuter les axes d’un tableau multidimensionnel (3D ou supérieur)
Résultat par défaut
T, transpose() peut être appliqué à des tableaux multidimensionnels de 3D ou plus.
Le résultat par défaut est le suivant. np.transpose() a le même résultat.
a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(a_3d.T)
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.T.shape)
# (4, 3, 2)
print(a_3d.transpose())
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.transpose().shape)
# (4, 3, 2)
Il est difficile de comprendre simplement en regardant le résultat de sortie, mais l’ordre de l’axe (dimension) de (0ème axe, 1er axe, 2ème axe) est inversé comme (2ème axe, 1er axe, 0ème axe).
Dans un tableau 2D, l’ordre de (0e axe, 1er axe) = (ligne, colonne) est remplacé par l’ordre de (1er axe, 0e axe) = (colonne, ligne).
Spécifiez l’ordre des axes avec transpose()
L’utilisation de T inverse toujours l’ordre, mais vous pouvez spécifier n’importe quel ordre en utilisant transpose().
Dans l’exemple suivant, spécifiez le même ordre inversé que celui par défaut et confirmez que le résultat ne change pas.
Dans la méthode ndarray transpose(), spécifiez l’ordre des axes avec des arguments de longueur variable ou un tuple.
print(a_3d.transpose(2, 1, 0))
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(a_3d.transpose(2, 1, 0).shape)
# (4, 3, 2)
print(a_3d.transpose((2, 1, 0)).shape)
# (4, 3, 2)
Dans np.transpose(), spécifiez l’ordre comme deuxième argument avec tuple. Il ne peut pas être spécifié avec des arguments de longueur variable.
print(np.transpose(a_3d, (2, 1, 0)))
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(np.transpose(a_3d, (2, 1, 0)).shape)
# (4, 3, 2)
# print(np.transpose(a_3d, 2, 1, 0))
# TypeError: transpose() takes from 1 to 2 positional arguments but 4 were given
Une erreur est générée si le nombre d’axes spécifiés ne correspond pas au nombre de dimensions du tableau d’origine ou si une dimension qui n’existe pas est spécifiée.
# print(a_3d.transpose(0, 1))
# ValueError: axes don't match array
# print(a_3d.transpose(0, 1, 2, 3))
# ValueError: axes don't match array
# print(a_3d.transpose(0, 1, 3))
# AxisError: axis 3 is out of bounds for array of dimension 3
Exemple : transposer plusieurs matrices à la fois
Par exemple, transpose() est utile lorsqu’un tableau 3D est un groupe de tableaux 2D.
Si les données des matrices sont stockées sous la forme d’un tableau 3D de forme (n, ligne, colonne), toutes les matrices peuvent être transposées comme suit.
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(a_3d.shape)
# (2, 3, 4)
print(a_3d.transpose(0, 2, 1))
# [[[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
#
# [[12 16 20]
# [13 17 21]
# [14 18 22]
# [15 19 23]]]
print(a_3d.transpose(0, 2, 1).shape)
# (2, 4, 3)
Si la forme est (ligne, colonne, n), vous pouvez procéder comme suit.
print(a_3d.transpose(1, 0, 2))
# [[[ 0 1 2 3]
# [12 13 14 15]]
#
# [[ 4 5 6 7]
# [16 17 18 19]]
#
# [[ 8 9 10 11]
# [20 21 22 23]]]
print(a_3d.transpose(1, 0, 2).shape)
# (3, 2, 4)
print(a_3d[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
print(a_3d.transpose(1, 0, 2)[:, :, 0])
# [[ 0 12]
# [ 4 16]
# [ 8 20]]