Diffusion (Broadcasting) en NumPy pour une Calculatrice Éfficiente

NumPyNumPyBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

La diffusion (broadcasting) est une fonction puissante dans NumPy qui permet d'utiliser des tableaux de formes différentes dans des opérations arithmétiques. Elle fournit un moyen de vectoriser les opérations sur les tableaux et d'améliorer l'efficacité de calcul. Ce laboratoire vous guidera dans les bases de la diffusion en NumPy.

Note: Vous pouvez écrire du code dans 05-broadcasting.ipynb. Certaines opérations d'impression sont omises dans les étapes, et vous pouvez imprimer la sortie selon vos besoins.

Comprendre la diffusion (broadcasting)

La diffusion (broadcasting) permet à NumPy d'effectuer des opérations élément par élément sur des tableaux de formes différentes. Le tableau plus petit est automatiquement « diffusé » pour correspondre à la forme du tableau plus grand. Cela se fait sous certaines contraintes, que nous explorerons dans les étapes suivantes.

Diffusion (broadcasting) avec des tableaux de même forme

Dans le cas le plus simple, deux tableaux doivent avoir exactement la même forme pour effectuer des opérations élément par élément. Par exemple :

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = np.array([2.0, 2.0, 2.0])
result = a * b

Dans ce cas, a et b ont la même forme, donc la multiplication est effectuée élément par élément et le résultat est [2.0, 4.0, 6.0].

Diffusion (broadcasting) avec une valeur scalaire

La diffusion (broadcasting) permet également d'effectuer des opérations élément par élément entre un tableau et une valeur scalaire. La valeur scalaire est automatiquement « étirée » pour correspondre à la forme du tableau. Par exemple :

import numpy as np

a = np.array([1.0, 2.0, 3.0])
b = 2.0
result = a * b

Dans ce cas, b est une valeur scalaire, mais elle est étirée pour devenir un tableau ayant la même forme que a. La multiplication est ensuite effectuée élément par élément, donnant [2.0, 4.0, 6.0].

Règles générales de diffusion (broadcasting)

NumPy compare les formes de deux tableaux élément par élément pour déterminer s'ils sont compatibles pour la diffusion (broadcasting). Les règles suivantes s'appliquent :

  1. Deux dimensions sont compatibles si elles ont la même taille.
  2. Deux dimensions sont compatibles si l'une d'entre elles a une taille de 1.

Si ces conditions ne sont pas remplies, une ValueError est levée, indiquant que les tableaux ont des formes incompatibles.

Exemples de diffusion (broadcasting)

Examillons quelques exemples pour comprendre comment la diffusion (broadcasting) fonctionne dans différents scénarios.

  • Exemple 1 :
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0, 3.0])
result = a + b

Dans ce cas, b est ajouté à chaque ligne de a. Le résultat est un tableau 2D ayant la même forme que a, où chaque élément est la somme des éléments correspondants dans a et b.

  • Exemple 2 :
import numpy as np

a = np.array([[1.0, 2.0, 3.0],
              [4.0, 5.0, 6.0]])
b = np.array([1.0, 2.0])
result = a + b

Dans ce cas, la diffusion (broadcasting) échoue car les dimensions finales de a et b ne sont pas égales. Il est impossible d'aligner les valeurs dans les lignes de a avec les éléments de b pour une addition élément par élément.

Exemple pratique - Quantification vectorielle

Explorons un exemple pratique où la diffusion (broadcasting) est utile. Considérons l'algorithme de quantification vectorielle (VQ) utilisé en théorie de l'information et en classification. L'opération de base dans la VQ est de trouver le point le plus proche dans un ensemble de points par rapport à un point donné. Cela peut être fait en utilisant la diffusion (broadcasting). Voici un exemple :

import numpy as np

observation = np.array([111.0, 188.0])
codes = np.array([[102.0, 203.0],
                  [132.0, 193.0],
                  [45.0, 155.0],
                  [57.0, 173.0]])
diff = codes - observation
dist = np.sqrt(np.sum(diff**2, axis=-1))
closest_index = np.argmin(dist)
closest_code = codes[closest_index]

Dans cet exemple, observation représente le poids et la taille d'un athlète à classifier, et codes représente différentes classes d'athlètes. En soustrayant observation de codes, la diffusion (broadcasting) est utilisée pour calculer la distance entre observation et chacun des codes. La fonction argmin est ensuite utilisée pour trouver l'indice du code le plus proche.

Récapitulatif

Dans ce laboratoire, nous avons appris à propos de la diffusion (broadcasting) en NumPy. La diffusion (broadcasting) permet d'effectuer des opérations élément par élément sur des tableaux ayant des formes différentes, ce qui en fait un outil puissant pour vectoriser les opérations sur les tableaux et améliorer l'efficacité de calcul. En comprenant les règles de diffusion (broadcasting) et en l'utilisant de manière appropriée, vous pouvez simplifier et optimiser votre code.