Comment compter le nombre de vrais éléments dans un tableau booléen NumPy

180

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?

norio
la source
4
Pour les pandas: stackoverflow.com/questions/26053849/…
Privé le

Réponses:

261

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 boolréponse spécifique. Plus généralement, vous pouvez utiliser numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5
David Alber
la source
2
Merci, David. Ils ont l'air bien. À propos de la méthode avec sum (..), True est-il toujours égal à 1 en python (ou au moins en numpy)? Si ce n'est pas garanti, j'ajouterai un chèque, 'if True == 1:' au préalable. À propos de count_nonzero (..), malheureusement, il ne semble pas implémenté dans mon module numpy à la version 1.5.1, mais j'aurai peut-être une chance de l'utiliser à l'avenir.
norio
4
@norio Concernant bool: les valeurs booléennes sont traitées comme 1 et 0 dans les opérations arithmétiques. Voir « Valeurs booléennes » dans la documentation de la bibliothèque standard Python. Notez que NumPy's boolet Python boolne sont pas les mêmes, mais ils sont compatibles (voir ici pour plus d'informations).
David Alber
1
@norio Concernant le fait de numpy.count_nonzerone pas être dans NumPy v1.5.1: vous avez raison. Selon cette annonce de version , il a été ajouté dans NumPy v1.6.0.
David Alber
25
FWIW, numpy.count_nonzeroest environ mille fois plus rapide, au moins dans mon interpréteur Python. python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"vs.python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
chbrown
6
@chbrown vous avez raison. Mais vous devriez comparer à la np.sum(bools)place! Cependant, np.count_nonzero(bools)est toujours ~ 12x plus rapide.
mab
29

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

En python brut, vous pouvez utiliser sum()pour compter les Truevaleurs dans un list:

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

Mais cela ne fonctionnera pas:

>>> sum([[False, False, True], [True, False, True]])
TypeError...
Guillaume Gendre
la source
Vous devez d'abord "aplatir" le tableau de tableaux. malheureusement, il n'y a pas de méthode intégrée, voir stackoverflow.com/questions/2158395/…
tommy chheng
2
Merci Guillaume! Fonctionne également avec les dataframes Pandas.
JJFord3
4

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

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

Salehinejad
la source