Ho un array NumPy 'boolarr' di tipo booleano. Voglio contare il numero di elementi i cui valori sono True
. Esiste una routine NumPy o Python dedicata a questa attività? Oppure, devo scorrere gli elementi nella mia sceneggiatura?
Ho un array NumPy 'boolarr' di tipo booleano. Voglio contare il numero di elementi i cui valori sono True
. Esiste una routine NumPy o Python dedicata a questa attività? Oppure, devo scorrere gli elementi nella mia sceneggiatura?
Risposte:
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 bool
risposta specifica. Più in generale, puoi usare numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
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 bool
e Python bool
non sono uguali, ma sono compatibili (vedi qui per maggiori informazioni).
numpy.count_nonzero
non essere in NumPy v1.5.1: hai ragione. Secondo questo annuncio di rilascio , è stato aggiunto in NumPy v1.6.0.
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)"
np.sum(bools)
invece! Tuttavia, np.count_nonzero(bools)
è ancora ~ 12 volte più veloce.
Quella domanda ha risolto una domanda abbastanza simile per me e ho pensato di condividere:
In raw Python puoi usare sum()
per contare i True
valori in un list
:
>>> sum([True,True,True,False,False])
3
Ma questo non funzionerà:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
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