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?

norio
fonte

Respostas:

261

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
David Alber
fonte
2
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:

>>> sum([True,True,True,False,False])
3

Mas isso não vai funcionar:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Guillaume Gendre
fonte
Você deve "achatar" a matriz de matrizes primeiro. Infelizmente, não há nenhum método incorporado, consulte stackoverflow.com/questions/2158395/...
tommy Chheng
2
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])

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

salehinejad
fonte