Accès rapide :
Introduction
Combiner un tableau et un scalaire
Ajouter un vecteur à chaque ligne
Ajouter un vecteur colonne
Centrer les colonnes d'une matrice
Diagnostiquer une erreur de broadcasting
Rendre les dimensions explicites
Le broadcasting est le mécanisme qui permet à NumPy de combiner des tableaux de formes différentes. NumPy ne duplique pas réellement les données : il raisonne comme si certaines dimensions étaient étendues virtuellement pour permettre le calcul.
Ce mécanisme est très puissant, mais il peut aussi rendre un code difficile à comprendre si les formes ne sont pas explicites. Il faut donc apprendre à lire les dimensions des tableaux manipulés.
Le cas le plus simple consiste à appliquer une opération entre un tableau et une valeur scalaire. Le scalaire est alors utilisé avec tous les éléments du tableau.
1 2 3 4 5 6 |
import numpy as np m = np.array([[1, 2, 3], [4, 5, 6]]) print(m + 10) print(m * 2) |
[[11 12 13] [14 15 16]] [[ 2 4 6] [ 8 10 12]]
Si l'on combine une matrice de forme (2, 3) avec un vecteur de forme (3,),
NumPy peut ajouter ce vecteur à chaque ligne de la matrice.
1 2 3 4 5 6 |
import numpy as np m = np.array([[1, 2, 3], [4, 5, 6]]) offsets = np.array([100, 200, 300]) print(m + offsets) |
[[101 202 303] [104 205 306]]
Les trois valeurs du vecteur correspondent aux trois colonnes de la matrice.
Pour appliquer une valeur différente à chaque ligne, on transforme le vecteur en colonne avec
np.newaxis.
1 2 3 4 5 6 7 |
import numpy as np m = np.array([[1, 2, 3], [4, 5, 6]]) col = np.array([10, 20])[:, np.newaxis] print(col) print(m + col) |
[[10] [20]] [[11 12 13] [24 25 26]]
Un usage courant du broadcasting consiste à retirer la moyenne de chaque colonne pour centrer les données. C'est une opération fréquente en analyse de données.
1 2 3 4 5 6 7 8 |
import numpy as np data = np.array([[10, 100], [20, 120], [30, 140]], dtype=np.float64) means = data.mean(axis=0) centered = data - means print(means) print(centered) |
[ 20. 120.] [[-10. -20.] [ 0. 0.] [ 10. 20.]]
La moyenne a une forme compatible avec les colonnes de la matrice. Elle est donc retirée à chaque ligne.
Toutes les formes ne sont pas compatibles. Si NumPy ne peut pas aligner les dimensions, il signale une erreur.
1 2 3 4 5 6 7 |
import numpy as np try: np.ones((2, 3)) + np.ones((2,)) except ValueError as error: print(type(error).__name__) print(error) |
ValueError operands could not be broadcast together with shapes (2,3) (2,)
Lorsque le doute est possible, affichez les formes ou ajoutez explicitement une dimension. Le code sera plus facile à relire.
1 2 3 4 5 6 7 |
import numpy as np v = np.array([1, 2, 3]) print(v.shape) print(v[np.newaxis, :].shape) print(v[:, np.newaxis].shape) |
(3,) (1, 3) (3, 1)
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 :