web-dev-qa-db-fra.com

Comment compter le nombre d'éléments vrais dans un tableau NumPy bool

J'ai un tableau NumPy 'boolarr' de type booléen. Je veux compter le nombre d'éléments dont les valeurs sont True. Existe-t-il une routine NumPy ou Python dédiée à cette tâche? Ou dois-je parcourir les éléments de mon script?

148
norio

Vous avez plusieurs options. Deux options sont les suivantes.

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)

Voici un exemple:

>>> 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

Bien sûr, c’est une réponse spécifique à bool. Plus généralement, vous pouvez utiliser numpy.count_nonzero.

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

Cette question a résolu une question assez similaire pour moi et j'ai pensé que je devrais partager:

En raw python, vous pouvez utiliser sum () pour compter les valeurs True dans un dict:

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

Mais ça ne marchera pas:

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

Cela aidera peut-être quelqu'un.

28
Guillaume Gendre

En termes de comparaison de deux tableaux numpy et de comptage du nombre de correspondances (prédiction de classe correcte dans l'apprentissage automatique, par exemple), j'ai trouvé utile l'exemple suivant pour deux dimensions:

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])

qui peut être étendu aux dimensions D.

Les résultats sont:

Prédiction:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

Cible:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

Nombre de prédictions correctes pour D = 1: 1

Nombre de prédictions correctes pour D = 2: 2

3
salehinejad

Si vous souhaitez effectuer un nombre par ligne, fournissez axis=1 à sum:

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

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

De même, avec np.count_nonzero:

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