Exercice 53 / 100

NumPy — Broadcasting

ConsigneComprends le broadcasting : opérations entre arrays de tailles différentes

📖 Cours

Le broadcasting est la règle qui permet à NumPy d'opérer sur des arrays de tailles différentes. Au lieu de planter, il étend chaque array sur les dimensions où celui-ci vaut 1 ou est absent, jusqu'à une forme commune aux deux. Attention : ce n'est pas toujours le plus petit qui rejoint le plus grand, la forme commune peut être plus grande que les deux arrays de départ.

Cas 1 : array + scalaire

matrix = np.array([[1, 2, 3], [4, 5, 6]])matrix * 2# → [[ 2 4 6]# [ 8 10 12]]

Le scalaire 2 est "diffusé" sur tous les éléments. C'est du broadcasting trivial.

Cas 2 : matrice + vecteur ligne

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # shape (3, 3)row = np.array([10, 20, 30]) # shape (3,)
matrix + row# → [[11 22 33]# [14 25 36]# [17 28 39]]

Le vecteur row est ajouté à chaque ligne. NumPy étend row à la verticale.

Le broadcasting recopie la ligne de trois valeurs sur chacune des trois lignes de la matrice : rien n'est inventé ni vraiment stocké, la même ligne sert trois fois
Le broadcasting recopie la ligne de trois valeurs sur chacune des trois lignes de la matrice : rien n'est inventé ni vraiment stocké, la même ligne sert trois fois

Cas 3 : matrice + vecteur colonne

col = np.array([[100], [200], [300]]) # shape (3, 1)
matrix + col# → [[101 102 103]# [204 205 206]# [307 308 309]]

Le vecteur col est ajouté à chaque colonne.

Les règles du broadcasting

Deux arrays sont compatibles si, en alignant leurs shapes À droite, chaque dimension :

- est égale,- OU vaut 1,- OU est absente.

Exemple : (3, 3) + (3,) → (3, 3) car (3,) = (1, 3) étendu sur 3 lignes Exemple : (3, 3) + (3, 1) → (3, 3) car (3, 1) étendu sur 3 colonnes Exemple : (3, 1) + (3,) → (3, 3) car les deux sont étendus : 9 valeurs au total, plus que les 3 de chaque array Exemple : (3, 3) + (2,) → ❌ shapes incompatibles

Cas d'usage : centrer/normaliser

data = np.random.randn(100, 3) # 100 lignes, 3 featurescentered = data - data.mean(axis=0) # mean = vecteur de 3 → broadcastingnormalized = centered / data.std(axis=0) # idem

Une seule ligne suffit pour normaliser tout un dataset.

Le broadcasting évite des boucles explicites et rend le code mathématique plus court. Mais ça peut piéger : vérifie toujours .shape avant de combiner.

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →