
Avec numpy.where, vous pouvez remplacer ou manipuler des éléments du tableau NumPy ndarray qui satisfont aux conditions.
Cet article décrit le contenu suivant.
- Présentation de np.where()
- np.where() avec plusieurs conditions
- Remplacer les éléments qui satisfont la condition
- Manipuler les éléments qui satisfont la condition
- Obtenir les indices des éléments qui satisfont la condition
Si vous souhaitez extraire ou supprimer des éléments, des lignes et des colonnes qui remplissent les conditions, consultez l’article suivant.
Présentation de np.where()
numpy.where(condition[, x, y])
Renvoie des éléments, soit de x soit de y, selon la condition.
Si seule la condition est donnée, retournez condition.nonzero().
numpy.where — Manuel NumPy v1.14
np.where() est une fonction qui renvoie ndarray qui est x si la condition est vraie et y si fausse. x, y et condition doivent pouvoir être diffusés sous la même forme.
Si x et y sont omis, index est renvoyé. Les détails sont décrits plus tard.
import numpy as np
a = np.arange(9).reshape((3, 3))
print(a)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
print(np.where(a < 4, -1, 100))
# [[ -1 -1 -1]
# [ -1 100 100]
# [100 100 100]]
Vous pouvez obtenir le booléen ndarray par une expression conditionnelle incluant ndarray sans utiliser np.where().
print(a < 4)
# [[ True True True]
# [ True False False]
# [False False False]]
np.where() avec plusieurs conditions
Vous pouvez appliquer plusieurs conditions avec np.where() en entourant chaque expression conditionnelle entre () et en utilisant & ou |.
print(np.where((a > 2) & (a < 6), -1, 100))
# [[100 100 100]
# [ -1 -1 -1]
# [100 100 100]]
print(np.where((a > 2) & (a < 6) | (a == 7), -1, 100))
# [[100 100 100]
# [ -1 -1 -1]
# [100 -1 100]]
Consultez l’article suivant pour savoir pourquoi vous devez utiliser &, | au lieu de et, ou et pourquoi les parenthèses sont nécessaires.
Même dans le cas de conditions multiples, il n’est pas nécessaire d’utiliser np.where() pour obtenir le ndarray booléen.
print((a > 2) & (a < 6))
# [[False False False]
# [ True True True]
# [False False False]]
print((a > 2) & (a < 6) | (a == 7))
# [[False False False]
# [ True True True]
# [False True False]]
Remplacer les éléments qui satisfont la condition
Il est également possible de remplacer des éléments par une valeur donnée uniquement lorsque la condition est satisfaite ou non.
Si vous passez le ndarray d’origine à x et y, la valeur d’origine est utilisée telle quelle.
print(np.where(a < 4, -1, a))
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
print(np.where(a < 4, a, 100))
# [[ 0 1 2]
# [ 3 100 100]
# [100 100 100]]
Notez que np.where() renvoie un nouveau ndarray et que le ndarray d’origine reste inchangé.
a_org = np.arange(9).reshape((3, 3))
print(a_org)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
a_new = np.where(a_org < 4, -1, a_org)
print(a_new)
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
print(a_org)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
Si vous souhaitez mettre à jour le ndarray d’origine lui-même, vous pouvez écrire :
a_org[a_org < 4] = -1
print(a_org)
# [[-1 -1 -1]
# [-1 4 5]
# [ 6 7 8]]
Manipuler les éléments qui satisfont la condition
Au lieu du ndarray d’origine, vous pouvez également spécifier des expressions pour x et y.
print(np.where(a < 4, a * 10, a))
# [[ 0 10 20]
# [30 4 5]
# [ 6 7 8]]
Obtenir les indices des éléments qui satisfont la condition
Si x et y sont omis, les indices des éléments satisfaisant la condition sont renvoyés.
Un tuple d’un tableau d’indices (numéro de ligne, numéro de colonne) qui satisfait la condition pour chaque dimension (ligne, colonne) est renvoyé.
print(np.where(a < 4))
# (array([0, 0, 0, 1]), array([0, 1, 2, 0]))
print(type(np.where(a < 4)))
# <class 'tuple'>
Dans ce cas, cela signifie que les éléments en [0, 0], [0, 1], [0, 2] et [1, 0] satisfont la condition.
Il est également possible d’obtenir une liste de chaque coordonnée en utilisant list(), zip() et * comme suit :
print(list(zip(*np.where(a < 4))))
# [(0, 0), (0, 1), (0, 2), (1, 0)]
Il en va de même pour les tableaux multidimensionnels de trois dimensions ou plus.
a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(np.where(a_3d < 5))
# (array([0, 0, 0, 0, 0]), array([0, 0, 0, 0, 1]), array([0, 1, 2, 3, 0]))
print(list(zip(*np.where(a_3d < 5))))
# [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0)]
Il en va de même pour les tableaux unidimensionnels. Notez qu’en utilisant list(), zip() et *, chaque élément de la liste résultante est un tuple avec un élément.
a_1d = np.arange(6)
print(a_1d)
# [0 1 2 3 4 5]
print(np.where(a_1d < 3))
# (array([0, 1, 2]),)
print(list(zip(*np.where(a_1d < 3))))
# [(0,), (1,), (2,)]
Si vous savez qu’il est unidimensionnel, vous pouvez utiliser le premier élément du résultat de np.where() tel quel. Dans ce cas, ce sera un ndarray avec un entier int comme élément, pas un tuple avec un élément. Si vous voulez convertir en liste, utilisez tolist().
print(np.where(a_1d < 3)[0])
# [0 1 2]
print(np.where(a_1d < 3)[0].tolist())
# [0, 1, 2]
Vous pouvez obtenir le nombre de dimensions avec l’attribut ndim.