224 votes

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

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 itérer sur les éléments dans mon script ?

4 votes

314voto

David Alber Points 6205

Vous avez plusieurs options. Deux de ces options sont les suivantes.

boolarr.sum()
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)

>>> boolarr.sum()
5

Bien sûr, c'est un bool -Réponse spécifique. De manière plus générale, vous pouvez utiliser numpy.count_nonzero .

>>> np.count_nonzero(boolarr)
5

3 votes

Merci, David. Ils sont superbes. À propos de la méthode avec sum(..), est-ce que True est toujours égal à 1 en python (ou au moins en numpy) ? Si ce n'est pas garanti, je vais ajouter une vérification, 'if True==1:' au préalable. A propos de count_nonzero(..), malheureusement, il semble qu'il ne soit pas implémenté dans mon module numpy à la version 1.5.1, mais j'aurai peut-être l'occasion de l'utiliser dans le futur.

5 votes

@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 de Python. Notez que la méthode de NumPy bool et Python bool ne sont pas les mêmes, mais elles sont compatibles (cf. aquí pour plus d'informations).

1 votes

@norio Concernant numpy.count_nonzero n'étant pas dans NumPy v1.5.1 : vous avez raison. D'après ce qui suit annonce de sortie il a été ajouté dans NumPy v1.6.0.

32voto

Guillaume Gendre Points 713

Cette question a permis de résoudre une question assez similaire pour moi et j'ai pensé que je devais la partager :

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

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

Mais ça ne marchera pas :

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

1 votes

Vous devez d'abord "aplatir" le tableau de tableaux. Malheureusement, il n'existe pas de méthode intégrée. stackoverflow.com/questions/2158395/

2 votes

Merci Guillaume ! Cela fonctionne également avec les dataframes Pandas.

5voto

salehinejad Points 2130

En termes de comparaison de deux tableaux numpy et de comptage du nombre de correspondances (par exemple, prédiction de classe correcte dans l'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

0voto

R. Kazmi Points 132
boolarr.sum(axis=1 or axis=0)

axe = 1 donnera le nombre de trues dans une ligne et axe = 0 comptera le nombre de trues dans les colonnes donc

boolarr[[true,true,true],[false,false,true]]
print(boolarr.sum(axis=1))

sera (3,1)

0voto

flow2k Points 706
b[b].size

donde b est le tableau booléen en question. Il filtre b pour True et ensuite compter la longueur du tableau filtré.

Ce n'est probablement pas aussi efficace np.count_nonzero() mentionné précédemment, mais est utile si vous oubliez l'autre syntaxe. De plus, cette syntaxe plus courte fait gagner du temps au programmeur.

Démonstration :

In [1]: a = np.array([0,1,3])

In [2]: a
Out[2]: array([0, 1, 3])

In [3]: a[a>=1].size
Out[3]: 2

In [5]: b=a>=1

In [6]: b
Out[6]: array([False,  True,  True])

In [7]: b[b].size
Out[7]: 2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X