numpy.where () explication / exemples détaillés, étape par étape [fermé]

168

J'ai du mal à bien comprendre numpy.where()malgré la lecture de la doc , de cet article et de cet autre article .

Quelqu'un peut-il fournir des exemples commentés étape par étape avec des tableaux 1D et 2D?

Alexandre Holden Daly
la source

Réponses:

272

Après avoir bidouillé pendant un moment, j'ai compris les choses et je les affiche ici en espérant que cela aidera les autres.

Intuitivement, np.wherec'est comme demander " dites-moi où dans ce tableau, les entrées satisfont une condition donnée ".

>>> a = np.arange(5,10)
>>> np.where(a < 8)       # tell me where in a, entries are < 8
(array([0, 1, 2]),)       # answer: entries indexed by 0, 1, 2

Il peut également être utilisé pour obtenir des entrées dans un tableau qui satisfont à la condition:

>>> a[np.where(a < 8)] 
array([5, 6, 7])          # selects from a entries 0, 1, 2

Quand aest un tableau 2d, np.where()renvoie un tableau d'idx de ligne et un tableau d'idx de col:

>>> a = np.arange(4,10).reshape(2,3)
array([[4, 5, 6],
       [7, 8, 9]])
>>> np.where(a > 8)
(array(1), array(2))

Comme dans le cas 1d, nous pouvons utiliser np.where()pour obtenir des entrées dans le tableau 2d qui satisfont la condition:

>>> a[np.where(a > 8)] # selects from a entries 0, 1, 2

tableau ([9])


Notez que quand avaut 1d, np.where()renvoie toujours un tableau d'idx de ligne et un tableau d'idx de col, mais les colonnes sont de longueur 1, donc cette dernière est un tableau vide.

Alexandre Holden Daly
la source
10
J'avais du mal à comprendre np.where lorsqu'il était utilisé sur 2d jusqu'à ce que je trouve votre réponse "Quand a est un tableau 2d, np.where () renvoie un tableau d'idx de ligne et un tableau d'idx de col:". Merci pour ça.
bencampbell_14
1
Je me sentais assez stupide après avoir lu la doc trois fois et toujours pas résolu le puzzle np.where(2d_array), merci d'avoir clarifié cela! Vous devez accepter votre propre réponse. e: Oh, c'est fermé. Eh bien, ça ne devrait pas être
smcs
5
C'est dommage que ce soit fermé. Cependant, je voudrais ajouter une autre fonctionnalité np.whereà cette réponse par ailleurs complète. La fonction peut également sélectionner des éléments du tableau x et y en fonction de la condition. Espace limité dans ce commentaire mais voir: np.where(np.array([[False,False,True], [True,False,False]]), np.array([[8,2,6], [9,5,0]]), np.array([[4,8,7], [3,2,1]]))reviendra array([[4, 8, 6], [9, 2, 1]]). Remarquez quels éléments de x et y sont choisis en fonction de Vrai / Faux
piccolo
L'explication donnée dans cette réponse n'est qu'un cas particulier de np.where. Selon la documentation, Lorsque seulement conditionest fourni, cette fonction est un raccourci pour np.asarray(condition).nonzero().
Lenny le
19

Voici un peu plus amusant. J'ai constaté que très souvent NumPy fait exactement ce que je souhaite qu'il fasse - parfois, il est plus rapide pour moi d'essayer des choses que de lire la documentation. En fait, un mélange des deux est préférable.

Je pense que votre réponse est bonne (et vous pouvez l'accepter si vous le souhaitez). C'est juste "extra".

import numpy as np

a = np.arange(4,10).reshape(2,3)

wh = np.where(a>7)
gt = a>7
x  = np.where(gt)

print "wh: ", wh
print "gt: ", gt
print "x:  ", x

donne:

wh:  (array([1, 1]), array([1, 2]))
gt:  [[False False False]
      [False  True  True]]
x:   (array([1, 1]), array([1, 2]))

... mais:

print "a[wh]: ", a[wh]
print "a[gt]  ", a[gt]
print "a[x]:  ", a[x]

donne:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]
euh
la source