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?
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?
Réponses:
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 bool
réponse spécifique. Plus généralement, vous pouvez utiliser numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
et Python bool
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 les True
valeurs dans un list
:
>>> sum([True,True,True,False,False])
3
Mais cela ne fonctionnera pas:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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