ti-enxame.com

Como contar o número de elementos verdadeiros em um array bool NumPy

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 a essa tarefa? Ou preciso iterar sobre os elementos do meu script?

142
norio

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

Claro, isso é uma resposta específica bool. Mais geralmente, você pode usar numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
208
David Alber

Essa pergunta resolveu uma questão bastante semelhante para mim e eu pensei que deveria compartilhar:

Em raw python você pode usar sum () para contar os valores True em um dict:

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

Mas isso não vai funcionar:

>>> sum([[False, False, True], [True, False, True]])
TypeError...

Talvez isso ajude alguém.

26
Guillaume Gendre

Em termos de comparação de dois matrizes numpy e contagem do número de correspondências (por exemplo, previsão de classe correta em aprendizado de máquina), achei o exemplo abaixo para duas dimensões útil:

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 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 de predição correta para D = 1: 1

Contagem de predição correta para D = 2: 2

3
salehinejad

Se você deseja fazer uma contagem por linha, forneça axis=1 para sum:

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

Da mesma forma, com np.count_nonzero:

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])
3
cs95