numpy.where () explicación detallada, paso a paso / ejemplos [cerrado]

168

Tengo problemas para comprender correctamente a numpy.where()pesar de leer el documento , esta publicación y esta otra publicación .

¿Alguien puede proporcionar ejemplos comentados paso a paso con matrices 1D y 2D?

Alexandre Holden Daly
fuente

Respuestas:

272

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

Intuitivamente, np.wherees 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 aes una matriz 2d, np.where()devuelve una matriz de idx de fila y una matriz de 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))

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

matriz ([9])


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

Alexandre Holden Daly
fuente
10
Estaba luchando por comprender 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 columna:". Gracias por eso.
bencampbell_14
1
Me sentí bastante estúpido después de leer el documento tres veces y todavía no resolví el rompecabezas np.where(2d_array), ¡gracias por aclarar esto! Deberías aceptar tu propia respuesta. e: Oh, está cerrado. Bueno, no debería ser
smcs
55
Es una pena que esto esté cerrado. Sin embargo, me gustaría agregar otra característica np.wherea esta respuesta completa. La función también puede seleccionar elementos de la matriz xey según 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]]))volverá array([[4, 8, 6], [9, 2, 1]]). Observe qué elementos de x e y se eligen dependiendo de Verdadero / Falso
piccolo
La explicación dada en esta respuesta es solo un caso especial de np.where. Según la documentación, cuando solo conditionse proporciona, esta función es una abreviatura para np.asarray(condition).nonzero().
Lenny
19

Aquí hay un poco más de diversión. He descubierto 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 solo "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]
UH oh
fuente