Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation Python
Les fondamentaux
Voir le programme détaillé

Comprendre le broadcasting avec NumPy

Opérations vectorisées et ufuncs Agrégations et statistiques


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

Introduction

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.

Combiner un tableau et un scalaire

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)
Broadcasting avec un scalaire

[[11 12 13]
 [14 15 16]]
[[ 2  4  6]
 [ 8 10 12]]

Ajouter un vecteur à chaque ligne

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)
Broadcasting d'un vecteur sur les lignes

[[101 202 303]
 [104 205 306]]

Les trois valeurs du vecteur correspondent aux trois colonnes de la matrice.

Ajouter un vecteur colonne

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)
Broadcasting avec un vecteur colonne

[[10]
 [20]]
[[11 12 13]
 [24 25 26]]

Centrer les colonnes d'une matrice

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)
Centrage colonne par colonne

[ 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.

Diagnostiquer une erreur de broadcasting

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)
Erreur de formes incompatibles

ValueError
operands could not be broadcast together with shapes (2,3) (2,) 

Rendre les dimensions explicites

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)
Ligne ou colonne explicite

(3,)
(1, 3)
(3, 1)

Opérations vectorisées et ufuncs Agrégations et statistiques




Vous êtes un professionnel et vous avez besoin d'une formation ? Mise en oeuvre d'IHM
avec Qt et PySide6
Voir le programme détaillé