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 boolresposta 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 boole Python boolnão são os mesmos, mas são compatíveis (veja aqui para mais informações).
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.
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 Truevalores 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