HOWTO · NumPy

Várias condições com numpy.where()

Veja quatro maneiras de combinar condições em arrays com numpy.where() em Python: usando os operadores &, | e as funções numpy.logical_and() e numpy.logical_or().

Nesta página

Combine comparações de arrays com & ou |, ou use numpy.logical_and() ou numpy.logical_or(). Em seguida, passe o array booleano resultante para numpy.where(). Ao usar & ou |, coloque cada comparação entre parênteses. Nos exemplos abaixo, selecionamos valores maiores que 2 e menores que 4, ou valores maiores que 2 ou divisíveis por 2. Use AND quando todas as condições precisarem ser verdadeiras; use OR quando bastar que uma delas seja verdadeira. Cada comparação produz um array booleano alinhado com values, e a combinação desses arrays cria a condição usada na seleção.

Cada exemplo abaixo exibe os valores selecionados; a saída correspondente vem logo após o código.

Implemente numpy.where() com várias condições usando o operador & em Python

Use & para exigir que todas as comparações sejam verdadeiras para um elemento do array. Coloque cada comparação entre parênteses, pois a precedência dos operadores em Python pode alterar a avaliação da expressão. O exemplo a seguir seleciona valores no intervalo entre 2 e 4, sem incluir os 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) retorna uma tupla com os índices correspondentes. Ao indexar values com essa tupla, você obtém os elementos selecionados; por isso, este exemplo retorna o valor 3. Para incluir mais condições, agrupe cada comparação entre parênteses e conecte-as com outro &. Para que o elemento permaneça no resultado, todas as condições combinadas precisam ser verdadeiras.

Implemente numpy.where() com várias condições usando o operador | em Python

Use | quando qualquer uma das comparações puder ser verdadeira. Em uma condição NumPy, o operador | executa um OR elemento a elemento: ele combina os valores booleanos correspondentes produzidos pelas duas comparações. Neste exemplo, um elemento é selecionado se for maior que 2 ou divisível por 2. Cada comparação fica entre parênteses antes da operação 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]

O valor 2 satisfaz o teste de divisibilidade; 3 e 5 satisfazem o teste de maior que; e 4 satisfaz os dois. numpy.where() retorna cada índice correspondente uma única vez, então 4 aparece apenas uma vez no resultado selecionado. Você pode combinar mais comparações entre parênteses com | quando qualquer um de vários testes puder incluir um elemento.

Implemente numpy.where() com várias condições usando a função numpy.logical_and()

numpy.logical_and() combina duas condições elemento a elemento e oferece uma forma funcional de fazer o mesmo que &. Passe o resultado para numpy.where() para obter os índices correspondentes e, depois, use esses índices para selecionar os 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]

Neste caso, as duas comparações precisam ser verdadeiras para que um elemento seja selecionado. Com entradas de mesmo formato, o array da condição tem o mesmo formato de values. Para acrescentar testes, combine os resultados das funções lógicas em etapas; isso pode facilitar a leitura e a inspeção de uma condição mais longa.

Implemente numpy.where() com várias condições usando a função numpy.logical_or() em Python

numpy.logical_or() combina condições elemento a elemento quando qualquer uma delas pode selecionar um elemento. Assim como no exemplo com o operador, este exemplo seleciona valores maiores que 2 ou divisíveis 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]

Use & e | para operações elemento a elemento em arrays; os operadores escalares and e or do Python não combinam arrays booleanos do NumPy. As funções lógicas são úteis quando você prefere operações nomeadas ou precisa montar uma condição por etapas. Para condições com formatos compatíveis, o NumPy aplica essas funções lógicas elemento a elemento. Em cada exemplo, values[np.where(condition)] usa a tupla de índices para recuperar os valores originais; np.where(condition) sozinho retorna as posições, não os valores nessas posições. Mantenha os formatos dos arrays de condição compatíveis com os dados que deseja selecionar.