¿Cómo logran internamente que puedas pasar algo como x> 5 en un método?
La respuesta corta es que no lo hacen.
Cualquier tipo de operación lógica en una matriz numérica devuelve una matriz booleana. (es decir __gt__
, __lt__
etc., todos devuelven matrices booleanas donde la condición dada es verdadera).
P.ej
x = np.arange(9).reshape(3,3)
print x > 5
rinde:
array([[False, False, False],
[False, False, False],
[ True, True, True]], dtype=bool)
Esta es la misma razón por la que algo como if x > 5:
genera un ValueError si x
es una matriz numpy. Es una matriz de valores verdaderos / falsos, no un solo valor.
Además, las matrices numpy se pueden indexar mediante matrices booleanas. Por ejemplo , x[x>5]
rendimientos [6 7 8]
, en este caso.
Honestamente, es bastante raro que realmente lo necesite, numpy.where
pero solo devuelve los índices donde está una matriz booleana True
. Por lo general, puede hacer lo que necesite con una indexación booleana simple.
numpy.where
tienen 2 'modos operativos', primero devuelve elindices
, dóndecondition is True
y si los parámetros opcionalesx
yy
están presentes (¡la misma forma quecondition
, o ampliable a dicha forma!), Devolverá valores dex
cuando decondition is True
otra maneray
. Por lo tanto, esto lo hacewhere
más versátil y permite que se use con más frecuencia. Gracias__getitem__
sintaxis de[]
overnumpy.where
o denumpy.take
. Dado__getitem__
que también debe admitir el corte, hay algunos gastos generales. He visto diferencias de velocidad notables al trabajar con las estructuras de datos de Python Pandas e indexar lógicamente columnas muy grandes. En esos casos, si no necesita cortar, entoncestake
y enwhere
realidad son mejores.Respuesta anterior es un poco confuso. Le da las UBICACIONES (todas) de donde su declaración es verdadera.
entonces:
Lo uso como alternativa a list.index (), pero también tiene muchos otros usos. Nunca lo he usado con matrices 2D.
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
Nueva respuesta Parece que la persona preguntaba algo más fundamental.
La pregunta era cómo USTED podría implementar algo que le permita a una función (como dónde) saber qué se solicitó.
Primero tenga en cuenta que llamar a cualquiera de los operadores de comparación es algo interesante.
Esto se hace sobrecargando el método "__gt__". Por ejemplo:
Como puede ver, "a> 4" era un código válido.
Puede obtener una lista completa y documentación de todas las funciones sobrecargadas aquí: http://docs.python.org/reference/datamodel.html
Algo que es increíble es lo sencillo que es hacer esto. TODAS las operaciones en Python se realizan de esa manera. Decir a> b es equivalente a a. gt (b)!
fuente
np.where(a > 30 and a < 50)
onp.where(30 < a < 50)
porque termina tratando de evaluar el Y lógico de dos matrices de valores booleanos, lo cual no tiene sentido. ¿Hay alguna forma de escribir tal condiciónnp.where
?np.where((a > 30) & (a < 50))
np.where
devuelve una tupla de longitud igual a la dimensión del ndarray numérico en el que se llama (en otras palabrasndim
) y cada elemento de la tupla es un ndarray numérico de índices de todos esos valores en el ndarray inicial para el que la condición es Verdadera. (No confunda la dimensión con la forma)Por ejemplo:
y es una tupla de longitud 2 porque
x.ndim
es 2. El primer elemento de la tupla contiene números de fila de todos los elementos mayores que 4 y el segundo elemento contiene números de columna de todos los elementos mayores que 4. Como puede ver, [1,2,2 , 2] corresponde a los números de fila de 5,6,7,8 y [2,0,1,2] corresponde a los números de columna de 5,6,7,8 Tenga en cuenta que el ndarray se atraviesa a lo largo de la primera dimensión (por filas ).Similar,
devolverá una tupla de longitud 3 porque x tiene 3 dimensiones.
Pero espera, ¡hay más en np.where!
cuando se agregan dos argumentos adicionales
np.where
; hará una operación de reemplazo para todas esas combinaciones de filas y columnas por pares que se obtienen mediante la tupla anterior.fuente