Comment utiliser la méthode numpy.where() en Python

En Python, nous pouvons utiliser la fonction numpy.where() pour sélectionner des éléments d’un tableau numpy, en fonction d’une condition.

Non seulement cela, mais nous pouvons effectuer des opérations sur ces éléments si la condition est satisfaite.

Voyons comment nous pouvons utiliser cette fonction, en utilisant quelques exemples illustratifs!


Syntaxe de Python numpy.where()

Cette fonction accepte un tableau de type numpy (par exemple, un tableau NumPy d’entiers/booléens).

Elle renvoie un nouveau tableau numpy, après filtrage en fonction d’une condition, qui est un tableau de type numpy de valeurs booléennes.

Par exemple, condition peut prendre la valeur de array([[True, True, True]]), qui est un tableau de type numpy booléen. (Par défaut, NumPy ne prend en charge que des valeurs numériques, mais nous pouvons également les convertir en bool)

Par exemple, si condition est array([[True, True, False]]), et que notre tableau est a = ndarray([[1, 2, 3]]), en appliquant une condition au tableau (a[:, condition]), nous obtiendrons le tableau ndarray([[1 2]]).

import numpy as np

a = np.arange(10)
print(a[a <= 2]) # Ne capturera que les éléments <= 2 et ignorera les autres

Sortie

array([0 1 2])

NOTE: La même condition peut également être représentée comme a <= 2. Ceci est le format recommandé pour le tableau de conditions, car écrire un tableau booléen est très fastidieux

Mais que faire si nous voulons préserver la dimension du résultat et ne pas perdre d’éléments de notre tableau d’origine? Nous pouvons utiliser numpy.where() pour cela.

numpy.where(condition [, x, y])

Nous avons deux autres paramètres x et y. Quels sont-ils?

En gros, cela signifie que si condition est vraie pour un élément de notre tableau, le nouveau tableau choisira des éléments de x.

Sinon, s’il est faux, des éléments de y seront pris.

Ainsi, notre tableau de sortie final sera un tableau avec des éléments de x partout où condition = True, et des éléments de y chaque fois que condition = False.

Notez que bien que x et y soient facultatifs, si vous spécifiez x, vous DEVEZ également spécifier y. C’est parce que, dans ce cas, la forme du tableau de sortie doit être la même que celle du tableau d’entrée.

NOTE: La même logique s’applique également aux tableaux uni et multidimensionnels. Dans les deux cas, nous filtrons en fonction de la condition. Rappelez-vous également que les formes de x, y et condition sont diffusées ensemble.

Maintenant, regardons quelques exemples pour comprendre correctement cette fonction.


Utilisation de numpy.where() en Python

Supposons que nous voulions ne prendre que les éléments positifs d’un tableau numpy et définir tous les éléments négatifs à 0, écrivons le code en utilisant numpy.where().

1. Remplacer les éléments avec numpy.where()

Nous utiliserons ici un tableau aléatoire en 2 dimensions et ne produirons que les éléments positifs.

import numpy as np

# Initialisation aléatoire d'un tableau en 2D
a = np.random.randn(2, 3)
print(a)

# b sera tous les éléments de a chaque fois que la condition est vraie (c'est-à-dire uniquement les éléments positifs)
# Sinon, définissez-le à 0
b = np.where(a > 0, a, 0)

print(b)

Sortie possible

[[-1.06455975  0.94589166 -1.94987123]
 [-1.72083344 -0.69813711  1.05448464]]
[[0.         0.94589166 0.        ]
 [0.         0.         1.05448464]]

Comme vous pouvez le voir, seuls les éléments positifs sont maintenant conservés !

2. Utilisation de numpy.where() avec seulement une condition

Il pourrait y avoir une certaine confusion concernant le code ci-dessus, car certains d’entre vous pourraient penser que la manière la plus intuitive serait simplement d’écrire la condition comme ceci:

import random
import numpy as np

a = np.random.randn(2, 3)
b = np.where(a > 0)
print(b)

Si vous essayez maintenant d’exécuter le code ci-dessus, avec ce changement, vous obtiendrez une sortie comme ceci:

(array([0, 1]), array([2, 1]))

Si vous observez attentivement, b est maintenant un tuple de tableaux numpy. Et chaque tableau est l’emplacement d’un élément positif. Que cela signifie-t-il?

Lorsque nous fournissons uniquement une condition, cette fonction est en fait équivalente à np.asarray.nonzero().

Dans notre exemple, np.asarray(a > 0) renverra un tableau de type booléen après application de la condition, et np.nonzero(arr_like) renverra les indices des éléments non nuls de arr_like. (Référez-vous à ceci lien)

Nous allons maintenant examiner un exemple plus simple, qui nous montre à quel point nous pouvons être flexibles avec numpy!

import numpy as np

a = np.arange(10)

b = np.where(a < 5, a, a * 10)

print(a)
print(b)

Sortie

[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4 50 60 70 80 90]

Ici, la condition est a < 5, ce qui sera le tableau semblable à numpy [True True True True True False False False False False], x est le tableau a, et y est le tableau a * 10. Ainsi, nous choisissons à partir de a uniquement si a < 5, et de a * 10, si a > 5.

Ainsi, cela transforme tous les éléments >= 5, par multiplication par 10. C’est en effet ce que nous obtenons!


Diffusion avec numpy.where()

Si nous fournissons tous les tableaux condition, x, et y, numpy les diffusera ensemble.

import numpy as np

a = np.arange(12).reshape(3, 4)

b = np.arange(4).reshape(1, 4)

print(a)
print(b)

# Diffuse (a < 5, a, et b * 10)
# de forme (3, 4), (3, 4) et (1, 4)
c = np.where(a < 5, a, b * 10)

print(c)

Production

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[0 1 2 3]]
[[ 0  1  2  3]
 [ 4 10 20 30]
 [ 0 10 20 30]]

Ici encore, la production est sélectionnée en fonction de la condition, donc tous les éléments, mais ici, b est diffusé pour avoir la forme de a. (Une de ses dimensions n’a qu’un seul élément, donc il n’y aura pas d’erreurs pendant la diffusion)

Donc, b deviendra maintenant [[0 1 2 3] [0 1 2 3] [0 1 2 3]], et maintenant, nous pouvons sélectionner des éléments même de ce tableau diffusé.

Ainsi, la forme de la production est la même que la forme de a.


Conclusion

Dans cet article, nous avons appris comment utiliser la fonction numpy.where() de Python pour sélectionner des tableaux en fonction d’un autre tableau de conditions.


Références


Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where