Supongamos que tengo una matriz numpy x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Quiero seleccionar los elementos y
correspondientes a los elementos x
que son mayores que 1 y menores que 5.
Lo intenté
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
Pero esto no funciona. ¿Cómo haría esto?
&
tiene mayor prioridad que<
y>
, que a su vez tienen mayor prioridad que (lógico)and
.x > 1 and x < 5
Evaluar las desigualdades primero y luego la conjunción lógica;x > 1 & x < 5
evalúa la conjunción bit a bit de1
y (los valores en)x
, luego las desigualdades.(x > 1) & (x < 5)
obliga a las desigualdades a evaluar primero, por lo que todas las operaciones ocurren en el orden previsto y los resultados están bien definidos. Ver documentos aquí.(0 < x) & (x < 10)
(como se muestra en la respuesta) en lugar de lo0 < x < 10
cual no funciona para matrices numpy en ninguna versión de Python.IMO OP en realidad no quiere
np.bitwise_and()
(aka&
) pero realmente quierenp.logical_and()
porque están comparando valores lógicos comoTrue
yFalse
- vea esta publicación SO en lógico vs. bit a bit para ver la diferencia.Y una forma equivalente de hacer esto es con
np.all()
estableciendo elaxis
argumento adecuadamente.Por los números:
así que usar
np.all()
es más lento, pero&
ylogical_and
son casi lo mismo.fuente
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
se evalúa (posiblemente creando una matriz enorme), aunque es el segundo argumento, porque esa evaluación ocurre fuera de la función. IOW,logical_and
pasa dos argumentos ya evaluados. Esto es diferente del caso habitual dea and b
, en el queb
no se evalúa sia
es truelike.Agregue un detalle a las respuestas de @JF Sebastian y @Mark Mikofski:
Si uno quiere obtener los índices correspondientes (en lugar de los valores reales de la matriz), el siguiente código servirá:
Para satisfacer múltiples (todas) condiciones:
Para satisfacer múltiples (o) condiciones:
fuente
(the array of indices you want,)
, por lo queselect_indices = np.where(...)[0]
deberá obtener el resultado que desea y esperarMe gusta usar
np.vectorize
para tales tareas. Considera lo siguiente:La ventaja es que puede agregar muchos más tipos de restricciones en la función vectorizada.
Espero eso ayude.
fuente
En realidad lo haría de esta manera:
L1 es la lista índice de elementos que satisfacen la condición 1; (tal vez pueda usar
somelist.index(condition1)
onp.where(condition1)
para obtener L1).Del mismo modo, obtienes L2, una lista de elementos que satisfacen la condición 2;
Luego encuentras la intersección usando
intersect(L1,L2)
.También puede encontrar la intersección de varias listas si obtiene múltiples condiciones para satisfacer.
Luego puede aplicar el índice en cualquier otra matriz, por ejemplo, x.
fuente
Para matrices 2D, puede hacer esto. Crea una máscara 2D usando la condición. Escriba la máscara de condición en int o float, dependiendo de la matriz, y multiplíquela con la matriz original.
fuente