Come contare il numero di elementi veri in un array bool NumPy


Risposte:


261

Hai più opzioni. Due opzioni sono le seguenti.

numpy.sum(boolarr)
numpy.count_nonzero(boolarr)

Ecco un esempio:

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

Certo, questa è una boolrisposta specifica. Più in generale, puoi usare numpy.count_nonzero.

>>> np.count_nonzero(boolarr)
5

2
Grazie David. Sembrano puliti. Circa il metodo con sum (..), True è sempre uguale a 1 in python (o almeno in numpy)? Se non è garantito, aggiungerò prima un segno di spunta "se True == 1:". A proposito di count_nonzero (..), sfortunatamente, non sembra implementato nel mio modulo numpy alla versione 1.5.1, ma potrei avere la possibilità di usarlo in futuro.
norio,

4
@norio Riguardo bool: i valori booleani sono trattati come 1 e 0 nelle operazioni aritmetiche. Vedi " Valori booleani " nella documentazione della Libreria standard di Python. Nota che NumPy boole Python boolnon sono uguali, ma sono compatibili (vedi qui per maggiori informazioni).
David Alber

1
@norio Per quanto riguarda il fatto di numpy.count_nonzeronon essere in NumPy v1.5.1: hai ragione. Secondo questo annuncio di rilascio , è stato aggiunto in NumPy v1.6.0.
David Alber

25
FWIW, numpy.count_nonzeroè circa mille volte più veloce, almeno nel mio interprete 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 hai ragione. Ma dovresti confrontarlo con np.sum(bools)invece! Tuttavia, np.count_nonzero(bools)è ancora ~ 12 volte più veloce.
martedì

29

Quella domanda ha risolto una domanda abbastanza simile per me e ho pensato di condividere:

In raw Python puoi usare sum()per contare i Truevalori in un list:

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

Ma questo non funzionerà:

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

Dovresti prima "appiattire" l'array di array. Purtroppo, non c'è nessun metodo integrato, vedere stackoverflow.com/questions/2158395/...
tommy Chheng

2
Grazie Guillaume! Funziona anche con i frame di dati Pandas.
JJFord3

4

In termini di confronto tra due array intorpiditi e il conteggio del numero di corrispondenze (ad es. La corretta previsione della classe nell'apprendimento automatico), ho trovato utile l'esempio seguente per due dimensioni:

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])

che può essere esteso alle dimensioni D.

I risultati sono:

Predizione:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

Bersaglio:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

Conteggio della previsione corretta per D = 1: 1

Conteggio della previsione corretta per D = 2: 2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.