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?
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?
Respostas:
Você tem várias opções. Duas opções são as seguintes.
numpy.sum(boolarr)
numpy.count_nonzero(boolarr)
Aqui está um exemplo:
>>> import numpy as np
>>> boolarr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]], dtype=np.bool)
>>> boolarr
array([[False, False, True],
[ True, False, True],
[ True, False, True]], dtype=bool)
>>> np.sum(boolarr)
5
Obviamente, essa é uma bool
resposta específica. Mais geralmente, você pode usar numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
e Python bool
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 contar True
valores em list
:
>>> sum([True,True,True,False,False])
3
Mas isso não vai funcionar:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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])
que pode ser estendido para as dimensões D.
Os resultados são:
Predição:
[[1 2]
[2 0]
[2 0]
[1 2]
[1 2]]
Alvo:
[[0 1]
[1 0]
[2 0]
[0 0]
[2 1]]
Contagem da previsão correta para D = 1: 1
Contagem da previsão correta para D = 2: 2