HOWTO · NumPy
Division par élément en Python NumPy
Il existe deux méthodes principales qui peuvent être utilisées pour effectuer une division élément par élément sur des tableaux NumPy en Python, la fonction numpy.divide() et l'opérateur /.
Sur cette page
Pour diviser les valeurs correspondantes de tableaux NumPy, utilisez numpy.divide(x1, x2) ou x1 / x2. Les deux effectuent une division réelle élément par élément et renvoient un tableau ; choisissez la forme fonctionnelle lorsque ses arguments facultatifs, comme out ou where, permettent de mieux contrôler le résultat.
Utiliser numpy.divide()
numpy.divide() prend d’abord le dividende, puis le diviseur. Pour des tableaux de même forme, chaque valeur du premier tableau est divisée par la valeur située à la même position dans le second. Affectez le tableau renvoyé à une variable si vous devez le réutiliser. L’argument out est facultatif : omettez-le pour que NumPy crée et renvoie un résultat, ou transmettez un tableau existant dont la forme et le type sont compatibles si vous souhaitez y stocker les résultats.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import numpy as np
numerators = np.array([12, 18, 24])
denominators = np.array([3, 6, 8])
by_function = np.divide(numerators, denominators)
destination = np.array([0.0, 0.0, 0.0])
np.divide(numerators, denominators, out=destination)
by_operator = numerators / denominators
print(by_function)
print(by_operator)
print(destination)
[4. 3. 3.]
[4. 3. 3.]
[4. 3. 3.]
Le premier appel à la fonction omet out et renvoie un nouveau tableau. Le deuxième écrit dans destination, créé avec la forme et le type du résultat. L’opérateur utilise les mêmes entrées : les trois tableaux contiennent donc les mêmes quotients. Les entrées sont des entiers, tandis que la division réelle produit des valeurs à virgule flottante.
Utiliser l’opérateur /
Dans la plupart des expressions, / est la façon la plus courte et la plus claire de diviser les éléments de tableaux NumPy. Écrivez result = numerators / denominators : les opérandes sont évalués position par position, et le tableau obtenu peut être affecté à une variable, indexé ou transmis à une autre opération NumPy. NumPy applique ses règles d’arithmétique sur les tableaux lorsqu’un opérande est un scalaire ou lorsque les deux tableaux ont des formes compatibles.
Cet opérateur ne réalise pas une division entière distincte : avec des tableaux d’entiers, / effectue une division réelle et les quotients sont représentés en virgule flottante. Cela diffère de // en Python, qui demande une division plancher. Choisissez l’opérateur selon l’opération souhaitée et n’utilisez pas // si vous avez besoin de quotients fractionnaires.
Diffusion, types de données et diviseurs nuls
Des tableaux de même forme divisent directement leurs éléments correspondants. NumPy diffuse aussi les formes compatibles : les dimensions sont comparées en partant de la droite, et chaque paire de dimensions doit être égale ou l’une d’elles doit valoir 1. Par exemple, un tableau à deux dimensions de forme (2, 3) peut être divisé par un tableau à une dimension de forme (3,) ; chaque diviseur s’applique alors à une ligne. Les formes qui ne respectent pas cette règle de diffusion ne peuvent pas être divisées élément par élément. En cas d’incompatibilité, vérifiez array.shape pour les deux opérandes.
Le type du résultat dépend des types d’entrée et de l’opération de division. En particulier, la division de valeurs entières avec / ou numpy.divide() produit un résultat de division réelle au lieu de tronquer chaque quotient en entier. Si une étape ultérieure exige un type précis, effectuez la conversion délibérément après la division et vérifiez si elle risque de supprimer la partie fractionnaire.
Avec une division réelle, / et numpy.divide() produisent des résultats à virgule flottante à partir d’entrées entières. Un diviseur nul peut donc produire l’infini si le numérateur est non nul, ou nan pour 0 / 0, avec un avertissement à l’exécution, comme avec des entrées à virgule flottante. Cet article porte sur ces formes de division réelle ; la division plancher avec // est une opération différente et n’a pas ce comportement. Pour exclure les positions où le diviseur est nul, initialisez d’abord un tableau de sortie, puis utilisez numpy.divide(a, b, out=result, where=b != 0) ; aux positions où la condition est fausse, les valeurs initialisées sont conservées. Choisissez une valeur de remplissage adaptée au calcul ultérieur et déterminez séparément comment traiter ces positions exclues.
Choisir une méthode de division
Utilisez / dans une expression directe lorsque vous souhaitez obtenir un quotient élément par élément de façon concise. Utilisez numpy.divide() lorsque ses arguments de fonction sont utiles, notamment out pour écrire dans un tableau de destination existant ou where pour sélectionner les positions à calculer. Quelle que soit la forme choisie, vérifiez que les opérandes ont des formes compatibles et déterminez comment traiter les diviseurs nuls selon les types de vos données. Ces vérifications facilitent l’adaptation du code aux vecteurs, aux matrices et aux entrées compatibles avec la diffusion.