Accès rapide :
Introduction
Modifier la forme avec reshape
Laisser NumPy calculer une dimension
Les formes incompatibles
Aplatir un tableau
Transposer une matrice
Ajouter ou supprimer une dimension
Assembler des tableaux
Découper un tableau
Un tableau NumPy possède un nombre total d'éléments et une forme. Tant que le nombre total d'éléments reste le même, il est souvent possible de présenter les données autrement : sous forme de vecteur, de matrice ou de tableau à plusieurs dimensions.
Ces opérations sont très fréquentes lorsque l'on prépare des données pour un calcul, un affichage ou une bibliothèque de machine learning. Elles ne modifient pas toujours les données elles-mêmes : elles changent parfois seulement la manière de les parcourir.
La méthode reshape permet de changer la forme logique d'un tableau. Le nombre total
d'éléments doit rester identique.
1 2 3 4 5 6 7 |
import numpy as np data = np.arange(12) m = data.reshape(3, 4) print(data) print(m) |
[ 0 1 2 3 4 5 6 7 8 9 10 11] [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
Le tableau initial contient douze valeurs. Il peut donc être transformé en matrice de trois lignes et quatre colonnes.
On peut utiliser -1 pour demander à NumPy de calculer automatiquement une dimension.
C'est pratique quand une seule dimension est inconnue.
1 2 3 4 5 6 |
import numpy as np data = np.arange(12) print(data.reshape(2, -1)) print(data.reshape(-1, 3).shape) |
[[ 0 1 2 3 4 5] [ 6 7 8 9 10 11]] (4, 3)
Dans le premier cas, NumPy comprend qu'il faut produire deux lignes et six colonnes. Dans le second, il calcule qu'il faut quatre lignes pour obtenir des groupes de trois valeurs.
Une forme incompatible provoque une erreur. C'est normal : dix valeurs ne peuvent pas remplir une matrice de trois lignes et quatre colonnes.
1 2 3 4 5 6 7 |
import numpy as np try: np.arange(10).reshape(3, 4) except ValueError as error: print(type(error).__name__) print(error) |
ValueError cannot reshape array of size 10 into shape (3,4)
Les fonctions ravel et flatten permettent de revenir à un vecteur.
La différence est importante : ravel peut retourner une vue, alors que flatten
retourne une copie.
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np m = np.arange(6).reshape(2, 3) view = m.ravel() copy = m.flatten() view[0] = 100 copy[1] = 200 print(m) print(view) print(copy) |
[[100 1 2] [ 3 4 5]] [100 1 2 3 4 5] [ 0 200 2 3 4 5]
La modification faite dans view est visible dans la matrice d'origine. La modification
faite dans copy reste isolée.
La transposition inverse les axes d'une matrice : les lignes deviennent des colonnes et les colonnes deviennent des lignes.
1 2 3 4 5 6 7 |
import numpy as np m = np.array([[1, 2, 3], [4, 5, 6]]) print(m) print(m.T) print(m.T.shape) |
[[1 2 3] [4 5 6]] [[1 4] [2 5] [3 6]] (3, 2)
Ajouter une dimension de taille un permet souvent de préparer un tableau pour le broadcasting. C'est une manière explicite de dire si un vecteur doit être vu comme une ligne ou comme une colonne.
1 2 3 4 5 6 7 8 9 10 |
import numpy as np v = np.array([10, 20, 30]) row = v[np.newaxis, :] col = v[:, np.newaxis] print(row.shape) print(col.shape) print(np.squeeze(col).shape) |
(1, 3) (3, 1) (3,)
NumPy propose plusieurs fonctions pour assembler des tableaux. concatenate colle les
tableaux sur un axe existant, tandis que stack crée un nouvel axe.
1 2 3 4 5 6 7 8 9 |
import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(np.concatenate([a, b])) print(np.stack([a, b])) print(np.vstack([a, b])) print(np.hstack([a, b])) |
[1 2 3 4 5 6] [[1 2 3] [4 5 6]] [[1 2 3] [4 5 6]] [1 2 3 4 5 6]
L'opération inverse consiste à découper un tableau en plusieurs morceaux avec split.
1 2 3 4 5 |
import numpy as np data = np.arange(12) print(np.split(data, 3)) |
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])]
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :