Como contar o número de elementos verdadeiros em uma matriz bool NumPy
180
Eu tenho uma matriz NumPy 'boolarr' do tipo booleano. Eu quero contar o número de elementos cujos valores são True. Existe uma rotina NumPy ou Python dedicada para esta tarefa? Ou preciso percorrer os elementos do meu script?
Obrigado David. Eles parecem arrumados. Sobre o método com sum (..), True é sempre igual a 1 em python (ou pelo menos em numpy)? Se não for garantido, adicionarei uma verificação 'se True == 1:' antes. Sobre o count_nonzero (..), infelizmente, ele não está implementado no meu módulo numpy na versão 1.5.1, mas talvez eu tenha a chance de usá-lo no futuro.
Norio 03/12/19
4
@norio Em relação bool: os valores booleanos são tratados como 1 e 0 em operações aritméticas. Consulte " Valores booleanos " na documentação da Biblioteca Padrão do Python. Observe que NumPy's boole Python boolnão são os mesmos, mas são compatíveis (veja aqui para mais informações).
quer
1
@ norio Quanto a numpy.count_nonzeronão estar no NumPy v1.5.1: você está certo. De acordo com este comunicado de lançamento , ele foi adicionado ao NumPy v1.6.0.
quer
25
FWIW, numpy.count_nonzeroé cerca de mil vezes mais rápido, pelo menos no meu intérprete Python. python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"vspython -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown
6
@chbrown você está certo. Mas você deve comparar ao np.sum(bools)invés! No entanto, np.count_nonzero(bools)ainda é ~ 12x mais rápido.
mab
29
Essa pergunta resolveu uma pergunta bastante semelhante para mim e achei que deveria compartilhar:
No python bruto, você pode usar sum()para contar Truevalores em list:
Obrigado Guillaume! Funciona com quadros de dados do Pandas também.
precisa saber é o seguinte
4
Em termos de comparação de duas matrizes numpy e contagem do número de correspondências (por exemplo, previsão correta de classe no aprendizado de máquina), achei o exemplo abaixo para duas dimensões úteis:
import numpy as np
result = np.random.randint(3,size=(5,2))# 5x2 random integer array
target = np.random.randint(3,size=(5,2))# 5x2 random integer array
res = np.equal(result,target)print result
print target
print np.sum(res[:,0])print np.sum(res[:,1])
Respostas:
Você tem várias opções. Duas opções são as seguintes.
Aqui está um exemplo:
Obviamente, essa é uma
bool
resposta específica. Mais geralmente, você pode usarnumpy.count_nonzero
.fonte
bool
: os valores booleanos são tratados como 1 e 0 em operações aritméticas. Consulte " Valores booleanos " na documentação da Biblioteca Padrão do Python. Observe que NumPy'sbool
e Pythonbool
não são os mesmos, mas são compatíveis (veja aqui para mais informações).numpy.count_nonzero
não estar no NumPy v1.5.1: você está certo. De acordo com este comunicado de lançamento , ele foi adicionado ao NumPy v1.6.0.numpy.count_nonzero
é cerca de mil vezes mais rápido, pelo menos no meu intérprete Python.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"
vspython -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
np.sum(bools)
invés! No entanto,np.count_nonzero(bools)
ainda é ~ 12x mais rápido.Essa pergunta resolveu uma pergunta bastante semelhante para mim e achei que deveria compartilhar:
No python bruto, você pode usar
sum()
para contarTrue
valores emlist
:Mas isso não vai funcionar:
fonte
Em termos de comparação de duas matrizes numpy e contagem do número de correspondências (por exemplo, previsão correta de classe no aprendizado de máquina), achei o exemplo abaixo para duas dimensões úteis:
que pode ser estendido para as dimensões D.
Os resultados são:
Predição:
Alvo:
Contagem da previsão correta para D = 1:
1
Contagem da previsão correta para D = 2:
2
fonte