¿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 xes 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.wherepero 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.wheretienen 2 'modos operativos', primero devuelve elindices, dóndecondition is Truey si los parámetros opcionalesxyyestán presentes (¡la misma forma quecondition, o ampliable a dicha forma!), Devolverá valores dexcuando decondition is Trueotra maneray. Por lo tanto, esto lo hacewheremás versátil y permite que se use con más frecuencia. Gracias__getitem__sintaxis de[]overnumpy.whereo 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, entoncestakey enwhererealidad 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.wheredevuelve 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.ndimes 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