HOWTO · NumPy
Condiciones múltiples con numpy.where()
Combina varias condiciones para seleccionar elementos de un array con numpy.where(), usando los operadores & y | o las funciones numpy.logical_and() y numpy.logical_or().
En esta página
Para seleccionar elementos de un array según varias condiciones, combina las comparaciones con & o |, o usa numpy.logical_and() o numpy.logical_or(). Después, pasa el array booleano resultante a numpy.where(). Si utilizas & o |, encierra cada comparación entre paréntesis. Elige AND cuando deban cumplirse todas las condiciones y OR cuando baste con que se cumpla una. Los ejemplos seleccionan valores mayores que 2 y menores que 4, o valores mayores que 2 o divisibles por 2. Cada comparación genera un array booleano alineado con values; al combinar esos arrays se obtiene la condición que se usará para seleccionar los elementos.
Cada ejemplo imprime los valores seleccionados; la salida aparece justo después del código.
Combinar varias condiciones con numpy.where() y el operador & en Python
Usa & para exigir que todas las comparaciones sean verdaderas para un elemento del array. Escribe cada comparación entre paréntesis: de lo contrario, la precedencia de los operadores de Python puede alterar la evaluación de la expresión. El siguiente ejemplo selecciona los valores comprendidos entre 2 y 4, sin incluir los extremos:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
result = values[np.where((values > 2) & (values < 4))]
print(result)
[3]
np.where(condition) devuelve una tupla con los índices que cumplen la condición. Al usar esa tupla para indexar values, se recuperan los elementos correspondientes; por eso, el ejemplo selecciona 3. Para añadir más condiciones, agrupa cada comparación entre paréntesis y únelas con otro &. El elemento solo se incluye en el resultado si cumple todas las pruebas.
Combinar varias condiciones con numpy.where() y el operador | en Python
Usa | cuando baste con que una de las comparaciones sea verdadera. En una condición de NumPy, este operador realiza un OR elemento a elemento: combina los valores booleanos correspondientes de ambas comparaciones. En el ejemplo, se selecciona un elemento si es mayor que 2 o divisible por 2. Cada comparación está entre paréntesis antes de aplicar el OR elemento a elemento:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
result = values[np.where((values > 2) | (values % 2 == 0))]
print(result)
[2 3 4 5]
El valor 2 cumple la prueba de divisibilidad; 3 y 5 cumplen la condición de ser mayores que 2, y 4 cumple ambas. numpy.where() devuelve cada índice coincidente una sola vez, de modo que 4 aparece una vez en el resultado. Puedes unir más comparaciones entre paréntesis con | si cualquiera de varias pruebas debe bastar para incluir un elemento.
Combinar condiciones en numpy.where() con numpy.logical_and()
numpy.logical_and() combina dos condiciones elemento a elemento y ofrece la alternativa en forma de función a &. Pasa el resultado a numpy.where() para obtener los índices coincidentes y usa esos índices para seleccionar los valores:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
condition = np.logical_and(values > 2, values < 4)
result = values[np.where(condition)]
print(result)
[3]
Para seleccionar un elemento, ambas comparaciones deben ser verdaderas. Con estas entradas de la misma forma, condition tiene la misma forma que values. Si necesitas más pruebas, combina los resultados de las funciones lógicas por etapas; así será más fácil leer y revisar una condición larga.
Combinar condiciones en numpy.where() con numpy.logical_or() en Python
numpy.logical_or() combina condiciones elemento a elemento cuando cualquiera de ellas puede hacer que se seleccione un elemento. Como en el ejemplo con el operador, aquí se seleccionan los valores mayores que 2 o divisibles por 2:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
condition = np.logical_or(values > 2, values % 2 == 0)
result = values[np.where(condition)]
print(result)
[2 3 4 5]
Usa & y | para combinar arrays elemento a elemento; los operadores escalares and y or de Python no sirven para combinar arrays booleanos de NumPy. Las funciones lógicas son útiles si prefieres operaciones con nombre o quieres construir la condición por etapas. Cuando las formas de las condiciones son compatibles, NumPy aplica esas funciones elemento a elemento. En cada ejemplo, values[np.where(condition)] utiliza la tupla de índices para recuperar los valores originales; np.where(condition) por sí solo devuelve posiciones, no los valores situados en ellas. Asegúrate de que las formas de las condiciones sean compatibles con los datos que quieres seleccionar.