¿Cómo uso numpy.where()? ¿Qué debo pasar y qué significa el resultado? [closed]

4 minutos de lectura

Avatar de usuario de Alexandre Holden Daly
Alejandro Holden Daly

Traté de leer el documentación para numpy.where()pero todavía estoy confundido.

¿Qué debo pasar por el condition, x y y ¿valores? Cuando paso solo condition, ¿qué significa el resultado y cómo puedo usarlo? ¿Qué pasa cuando paso los tres?

Encontré ¿Cómo funciona python numpy.where()? pero no respondió a mi pregunta porque parece tratarse de la implementación y no de cómo usarlo. Numpy where() en una matriz 2D tampoco me explicó las cosas; Estoy buscando una explicación paso a paso, en lugar de una guía práctica para un caso específico.

Incluya ejemplos con datos de origen 1D y 2D.

Avatar de usuario de Alexandre Holden Daly
Alejandro Holden Daly

Después de jugar un rato, descubrí las cosas y las estoy publicando aquí con la esperanza de que ayuden a otros.

Intuitivamente, np.where es como preguntar”dime dónde en esta matriz, las entradas satisfacen una condición dada“.

>>> 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

También se puede usar para obtener entradas en una matriz que satisfagan la condición:

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

Cuando a es una matriz 2d, np.where() devuelve una matriz de idx de fila y una matriz de idx de columna:

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

Como en el caso 1d, podemos usar np.where() para obtener entradas en la matriz 2d que satisfagan la condición:

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

formación([9])


Tenga en cuenta, cuando a es 1d, np.where() todavía devuelve una matriz de idx de fila y una matriz de idx de columna, pero las columnas tienen una longitud de 1, por lo que la última es una matriz vacía.

  • Estaba luchando por entender np.where cuando se usaba en 2d hasta que encontré su respuesta “Cuando a es una matriz 2d, np.where() devuelve una matriz de idx de fila y una matriz de idx de col:”. Gracias por eso.

    – bencampbell_14

    6 de mayo de 2017 a las 1:56

  • Me sentía bastante estúpido después de leer el documento tres veces y seguir sin resolver el acertijo. np.where(2d_array), ¡Gracias por aclarar esto! Debes aceptar tu propia respuesta. e: Ah, está cerrado. Bueno, no debería ser

    – smcs

    7 de marzo de 2018 a las 9:59


  • Es una pena que esto estuviera cerrado. Sin embargo, me gustaría agregar otra característica de np.where a esta respuesta por lo demás completa. La función también puede seleccionar elementos de la matriz x e y dependiendo de la condición. Espacio limitado en este comentario pero ver: 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]])) regresará array([[4, 8, 6], [9, 2, 1]]). Observe qué elementos de x e y se eligen según Verdadero/Falso

    – flautín

    4 de agosto de 2018 a las 12:06


  • La explicación dada en esta respuesta es solo un caso especial de np.where. De acuerdo con la documentación, cuando solo condition se proporciona, esta función es una abreviatura de np.asarray(condition).nonzero().

    – Lenny

    12 de julio de 2020 a las 22:03

Aquí hay un poco más de diversión. Descubrí que, muy a menudo, NumPy hace exactamente lo que desearía que hiciera; a veces, es más rápido para mí probar cosas que leer los documentos. En realidad, una mezcla de ambos es lo mejor.

Creo que su respuesta está bien (y está bien aceptarla si lo desea). Esto es simplemente “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

da:

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

… pero:

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

da:

a[wh]:  [8 9]
a[gt]   [8 9]
a[x]:   [8 9]

  • stackoverflow.com/questions/52649568/use-of-np-where0

    – asssss

    15 de abril de 2020 a las 19:55

¿Ha sido útil esta solución?