Comment utiliser la méthode numpy.where() de 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 certaines opérations sur ces éléments si la condition est remplie.
Regardons comment nous pouvons utiliser cette fonction, en utilisant quelques exemples illustratifs !
Syntaxe de numpy.where() de Python
Cette fonction accepte un tableau semblable à numpy (par exemple, un tableau NumPy d'entiers/booléens).
Il renvoie un nouveau tableau numpy, après filtrage basé sur 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 boolean semblable à numpy. (Par défaut, NumPy ne prend en charge que les valeurs numériques, mais nous pouvons également les convertir en bool)
Par exemple, si condition est array([[True, True, False]]), et 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]) # Will only capture elements <= 2 and ignore others
array([0 1 2])
REMARQUE: La même condition peut également être représentée par a <= 2. C'est le format recommandé pour le tableau de conditions, car il est très fastidieux de l'écrire sous forme de tableau booléen.
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 ?
Fondamentalement, ce que cela dit, c'est que si condition est vraie pour un certain élément de notre tableau, le nouveau tableau choisira des éléments de x.
Sinon, si c'est faux, des éléments de y seront pris.
Avec cela, notre tableau de sortie final sera un tableau contenant des éléments de x chaque fois que condition=True, et des éléments de y chaque fois que condition=False.
Notez que bien que x et y soient optionnels, si vous spécifiez x, vous DEVREZ également spécifier y. Cela est dû au fait que, dans ce cas, la forme du tableau de sortie doit être identique à celle du tableau d'entrée.
REMARQUE : La même logique s'applique aux tableaux à une seule et à plusieurs dimensions aussi. Dans les deux cas, nous filtrons en fonction de la condition. N'oubliez pas également que les formes de x, y et condition sont diffusées ensemble.
Maintenant, examinons quelques exemples pour bien comprendre cette fonction.
Utiliser numpy.where() de Python
Supposons que nous voulions ne prendre que les éléments positifs d'un tableau numpy et mettre tous les éléments négatifs à 0, écrivons le code en utilisant numpy.where().
1. Remplacer des éléments avec numpy.where()
Nous utiliserons un tableau aléatoire à deux dimensions ici, et nous afficherons uniquement les éléments positifs.
import numpy as np
Random initialization of a (2D array)
a = np.random.randn(2, 3)
print(a)
b will be all elements of a whenever the condition holds true (i.e only positive elements)
Otherwise, set it as 0
b = np.where(a > 0, a, 0)
print(b)
[[-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. Utiliser numpy.where() avec seulement une condition
Il peut y avoir une certaine confusion concernant le code ci-dessus, car certains d'entre vous peuvent penser que la façon la plus intuitive serait de simplement é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 de près, b est maintenant un tuple de tableaux numpy. Et chaque tableau est l'emplacement d'un élément positif. Que signifie cela ?
Chaque fois que nous fournissons simplement 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 avoir appliqué la condition, et np.nonzero(arr_like) renverra les indices des éléments non nuls de arr_like. (Consultez ce 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 donnera 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. Donc, nous choisissons de a uniquement si a < 5, et de a * 10, si a > 5.
Ainsi, cela transforme tous les éléments >= 5, en les multipliant par 10. C'est ce que nous obtenons effectivement!
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)
Broadcasts (a < 5, a, and b * 10)
of shape (3, 4), (3, 4) and (1, 4)
c = np.where(a < 5, a, b * 10)
print(c)
[[ 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]]
Encore une fois, ici, la sortie est sélectionnée en fonction de la condition, donc tous les éléments, mais ici, b est diffusé à 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 va maintenant devenir [[0 1 2 3] [0 1 2 3] [0 1 2 3]], et maintenant, nous pouvons sélectionner des éléments même à partir de ce tableau diffusé.
Ainsi, la forme de la sortie est la même que celle de a.
Conclusion
Dans cet article, nous avons appris comment nous pouvons utiliser la fonction numpy.where() de Python pour sélectionner des tableaux en fonction d'un autre tableau de condition.
Références
- Documentation SciPy sur la fonction numpy.where() de Python
