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?
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:
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])
Réponses:
Vous avez plusieurs options. Deux options sont les suivantes.
Voici un exemple:
Bien sûr, c'est une
bool
réponse spécifique. Plus généralement, vous pouvez utilisernumpy.count_nonzero
.la source
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'sbool
et Pythonbool
ne sont pas les mêmes, mais ils sont compatibles (voir ici pour plus d'informations).numpy.count_nonzero
ne pas être dans NumPy v1.5.1: vous avez raison. Selon cette annonce de version , il a été ajouté dans NumPy v1.6.0.numpy.count_nonzero
est 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)"
np.sum(bools)
place! Cependant,np.count_nonzero(bools)
est toujours ~ 12x plus rapide.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 lesTrue
valeurs dans unlist
:Mais cela ne fonctionnera pas:
la source
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:
qui peut être étendu aux dimensions D.
Les résultats sont:
Prédiction:
Cible:
Nombre de prédictions correctes pour D = 1:
1
Nombre de prédictions correctes pour D = 2:
2
la source