On ne pose pas de cookies de suivi nous-mêmes. Les vidéos de cours sont hébergées sur YouTube, qui dépose ses propres cookies dès qu'une vidéo se charge — elles restent disponibles en un clic si vous préférez ne pas les accepter maintenant.
Calculer sur des tableaux de tailles différentes (broadcasting) · Python — Sup2Tech
Calculer sur des tableaux de tailles différentes (broadcasting)
0/6
Vidéo
Étape 1 sur 4, Vidéo
NumPy : le broadcasting
Points clés de cette vidéo
Le broadcasting permet à NumPy d'effectuer une opération entre deux arrays de tailles différentes, sans boucle
Exemple typique : ajouter un vecteur (une ligne) à chaque ligne d'une matrice 2D
NumPy « étire » virtuellement le plus petit array pour qu'il corresponde à la forme du plus grand, sans dupliquer réellement la mémoire
Transcription de la vidéo
Lorsque l'on fait des opérations arithmétiques sur des tableaux NumPy, les opérations sont faites en général élément par élément. Évidemment, pour que ces opérations aient du sens, l'addition, la multiplication, il faut que les tableaux aient les mêmes dimensions. Cependant, il arrive que l'on veuille faire des opérations sur des tableaux de dimensions différentes. Dans ce cas-là, NumPy définit une notion que l'on appelle le broadcasting qui permet de donner un sens à ces opérations entre tableaux de tailles différentes. Ouvrons maintenant un notebook pour découvrir cette notion. Commençons par créer deux tableaux. Je vais écrire un tableau a qui est array de 1, 2, 3 et je vais écrire b qui est np.array de 5, 5 et 5. Et maintenant, faisons a fois b et regardons le résultat. Alors, le résultat, sans surprise, est le résultat de la multiplication élément par élément des deux tableaux, donc j'ai fait 5 fois 1, 5 fois 2, 5 fois 3. Maintenant, créons un troisième tableau, c qui est égal à np.array de uniquement 5. Et maintenant, faisons a fois c. Regardons le résultat, j'obtiens le même résultat. Or, c n'a pas la même dimension que a. Alors qu'est-ce qu'il s'est passé ici ? En fait, NumPy a fait du broadcasting, il a propagé la valeur contenue dans le tableau c sur chaque élément du tableau a, ce qui me permet de faire la même opération que si mon tableau c avait été de dimension 3. Évidemment, on n'est pas obligé de créer des tableaux avec un seul élément, et le broadcasting se généralise à l'opération faite simplement avec un entier. Et donc ici, de nouveau, je vais obtenir le même résultat, mon entier 5 a été propagé, broadcasté, sur chaque élément de mon tableau a. Évidemment le broadcasting est plus général que le simple exemple que l'on vient de voir. Le broadcasting s'applique à des tableaux à n dimensions, mais avec deux inconvénients majeurs. Premièrement, lorsque l'on dépasse des tableaux de deux ou trois dimensions, il devient extrêmement difficile de comprendre ce que va faire cette opération de broadcasting. Le deuxième inconvénient, c'est que le broadcasting peut produire des tableaux de très grandes dimensions et par conséquent, poser un problème de mémoire. Dans la suite, je vais regarder uniquement des exemples basés sur des tableaux à deux dimensions. Commençons par un exemple. Ici, je vais créer un tableau avec une ligne et trois colonnes, 1, 2, 3 et je vais créer un deuxième tableau qui va être un tableau à trois dimensions, qui contient trois lignes et trois colonnes qui ne sont que des 1. Et maintenant, je vais faire une multiplication entre ces deux tableaux. Donc je vais multiplier une ligne par un tableau à trois dimensions. Pour que l'opération de broadcasting soit définie, il faut appliquer la règle suivante : on prend les dimensions en partant de la droite donc ici, 3, 3 et ces dimensions doivent soit être égales soit l'une des deux doit être égale à 1. pour que l'opération de broadcasting soit définie. Donc ici, 3, 3 : les deux dimensions sont égales et ici, 1, 3 : l'une des deux est égale à 1 donc l'opération de broadcasting est définie. Alors, que va faire ce broadcasting ? Il va faire la chose suivante : il va propager ma ligne sur chacune des lignes du tableau 1, 1. Ici, le point important c'est que cette propagation n'est pas faite en créant un nouveau tableau. C'est quelque chose qui est fait de manière dynamique en appliquant la vectorisation donc sans créer de structure de données temporaire. Et maintenant que j'ai un tableau 1, 2, 3, 1, 2, 3, 1, 2, 3 multiplié au tableau 1, 1, 1, 1, 1, 1 et 1, 1, 1, mon opération de multiplication est définie élément par élément et le résultat va donc être, évidemment, ce nouveau tableau, 1, 2, 3, 1, 2, 3, 1, 2, 3. Prenons maintenant un nouvel exemple. Je vais maintenant définir un tableau qui va contenir trois lignes et une colonne. Et je vais définir un deuxième tableau, qui est toujours mon tableau à trois dimensions, trois lignes, trois colonnes, qui ne contient que des entiers 1. Et je veux de nouveau appliquer cette opération de multiplication. Donc de nouveau, pour que le broadcasting soit défini, il faut que mes dimensions, en partant de la droite, en les alignant par la droite, soient soit les mêmes ou alors que l'une des deux soit égale à 1. Donc ici, j'ai 3, 1, donc l'une des deux est égale à 1, et la deuxième dimension, c'est 3, 3, elles sont égales, donc le broadcasting est défini. Et donc, que va faire mon opération de broadcasting dans ce cas-là ? Elle va propager ma colonne sur les autres colonnes de mon tableau 1, 1. De nouveau, je ne crée pas de tableau temporaire. Et maintenant, je vais pouvoir définir mon opération de multiplication élément par élément. Et donc le résultat, dans ce cas-là, va être une ligne de 1, une ligne de 2, une ligne de 3. Pour finir, regardons ce dernier exemple. Je vais définir un tableau à trois lignes et une colonne. Et je vais définir un tableau qui va être à une ligne et deux colonnes. Et je vais multiplier ces deux tableaux. Donc regardons si l'opération de broadcasting est définie dans ce cas. Je vais aligner mes dimensions par la droite, et donc, la dimension la plus à droite, c'est 2, 1 ; l'une des deux est égale à 1 donc pour l'instant, le broadcasting est défini. La deuxième dimension, c'est 3, 1 ; une des deux est égale à 1 ; de nouveau, l'opération de broadcasting est définie. Et dans ce cas-là, je vais produire un nouveau tableau qui va avoir pour dimensions le maximum de la dimension des deux tableaux sur chaque axe, donc mon résultat, ça va être un tableau 3, 2. Et donc, que va faire l'opération de broadcasting ? Elle va propager ma colonne 1, 2, 3 sur une deuxième colonne pour correspondre à un tableau 3, 2 donc à trois lignes et deux colonnes ; et elle va propager ma ligne 4, 5 sur trois lignes pour que de nouveau, j'ai un tableau de dimensions 3, 2. Je vous rappelle qu'ici encore, cette opération de broadcasting est faite sans créer de structure de données temporaire donc c'est quelque chose qui est fait de manière dynamique et de manière extrêmement efficace. Maintenant que j'ai deux tableaux de dimensions 3, 2, je peux les multiplier élément par élément et j'obtiens donc le résultat suivant. Dans cette vidéo, nous avons vu la notion de broadcasting qui permet de donner un sens à des opérations sur des tableaux de dimensions différentes. Nous avons vu que l'opération de broadcasting ne créait pas de structure de données temporaire mais évidemment, le résultat de l'opération de broadcasting va créer l'allocation d'un nouveau tableau qui peut être de très grandes dimensions. Par conséquent, il faut faire attention à cette opération qui peut créer des problèmes de gestion de la mémoire. Une autre difficulté avec l'opération de broadcasting, c'est qu'il peut être difficile de donner un sens à du broadcasting sur des tableaux au-delà de deux ou trois dimensions. C'est pourquoi on vous recommande de limiter ce type d'opération à des tableaux de faibles dimensions. À bientôt !