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


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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.