Suponha que eu tenho uma matriz numpy x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Desejo selecionar os elementos y
correspondentes aos elementos x
maiores que 1 e menores que 5.
eu tentei
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']
mas isso não funciona. Como eu faria isso?
&
tem precedência maior que<
e>
, que por sua vez tem precedência maior que (lógico)and
.x > 1 and x < 5
evoca primeiro as desigualdades e depois a conjunção lógica;x > 1 & x < 5
avalia a conjunção bit a bit de1
e (os valores em)x
e as desigualdades.(x > 1) & (x < 5)
força as desigualdades a avaliar primeiro, para que todas as operações ocorram na ordem pretendida e os resultados sejam todos bem definidos. Veja os documentos aqui.(0 < x) & (x < 10)
(como mostrado na resposta) em vez de0 < x < 10
não funcionar com matrizes numpy em qualquer versão do Python.O IMO OP realmente não quer
np.bitwise_and()
(aka&
), mas realmente quernp.logical_and()
porque eles estão comparando valores lógicos comoTrue
eFalse
- veja esta postagem do SO em lógico versus bit a bit para ver a diferença.E uma maneira equivalente de fazer isso é
np.all()
definindo oaxis
argumento adequadamente.pelos números:
portanto, usando
np.all()
é mais lento, mas&
elogical_and
são sobre o mesmo.fonte
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
é avaliado (possivelmente criando uma matriz enorme), mesmo que seja o segundo argumento, porque essa avaliação ocorre fora da função. IOW,logical_and
recebe dois argumentos já avaliados. Isso é diferente do caso usual dea and b
, no qualb
não é avaliado sea
é verdadeiro.Adicione um detalhe às respostas de @JF Sebastian e @Mark Mikofski:
Se alguém deseja obter os índices correspondentes (em vez dos valores reais da matriz), o seguinte código será o seguinte:
Para satisfazer várias (todas) condições:
Para satisfazer várias condições (ou):
fonte
(the array of indices you want,)
você precisaráselect_indices = np.where(...)[0]
obter o resultado desejado e esperar.Eu gosto de usar
np.vectorize
para essas tarefas. Considere o seguinte:A vantagem é que você pode adicionar muitos outros tipos de restrições na função vetorizada.
Espero que ajude.
fonte
Na verdade, eu faria assim:
L1 é a lista de índices de elementos que satisfazem a condição 1; (talvez você possa usar
somelist.index(condition1)
ounp.where(condition1)
obter L1.)Da mesma forma, você obtém L2, uma lista de elementos que satisfazem a condição 2;
Então você encontra a interseção usando
intersect(L1,L2)
.Você também pode encontrar a interseção de várias listas se tiver várias condições para satisfazer.
Em seguida, você pode aplicar o índice em qualquer outra matriz, por exemplo, x.
fonte
Para matrizes 2D, você pode fazer isso. Crie uma máscara 2D usando a condição Crie a máscara de condição para int ou float, dependendo da matriz, e multiplique-a pela matriz original.
fonte