Ich habe ein NumPy-Array 'boolarr' vom booleschen Typ. Ich möchte die Anzahl der Elemente zählen, deren Werte sind True
. Gibt es eine NumPy- oder Python-Routine für diese Aufgabe? Oder muss ich die Elemente in meinem Skript durchlaufen?
Ich habe ein NumPy-Array 'boolarr' vom booleschen Typ. Ich möchte die Anzahl der Elemente zählen, deren Werte sind True
. Gibt es eine NumPy- oder Python-Routine für diese Aufgabe? Oder muss ich die Elemente in meinem Skript durchlaufen?
Antworten:
Sie haben mehrere Möglichkeiten. Zwei Optionen sind die folgenden.
numpy.sum(boolarr)
numpy.count_nonzero(boolarr)
Hier ist ein Beispiel:
>>> 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
Das ist natürlich eine bool
spezifische Antwort. Allgemeiner können Sie verwenden numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
bool
: Boolesche Werte werden in arithmetischen Operationen als 1 und 0 behandelt. Siehe " Boolesche Werte " in der Dokumentation zur Python-Standardbibliothek. Beachten Sie, dass NumPy's bool
und Python bool
nicht identisch sind, aber kompatibel (siehe hier für weitere Informationen).
numpy.count_nonzero
nicht in NumPy v1.5.1: Sie haben Recht. Laut dieser Release-Ankündigung wurde es in NumPy v1.6.0 hinzugefügt.
numpy.count_nonzero
ist zumindest in meinem Python-Interpreter ungefähr tausendmal schneller. 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)
stattdessen mit vergleichen ! Ist np.count_nonzero(bools)
aber immer noch ~ 12x schneller.
Diese Frage löste eine ganz ähnliche Frage für mich und ich dachte, ich sollte teilen:
In roher Python können Sie verwenden , sum()
zählen True
Werte in a list
:
>>> sum([True,True,True,False,False])
3
Aber das wird nicht funktionieren:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
In Bezug auf den Vergleich von zwei Numpy-Arrays und das Zählen der Anzahl von Übereinstimmungen (z. B. korrekte Klassenvorhersage beim maschinellen Lernen) fand ich das folgende Beispiel für zwei Dimensionen nützlich:
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])
die auf D-Dimensionen erweitert werden kann.
Die Ergebnisse sind:
Prognose:
[[1 2]
[2 0]
[2 0]
[1 2]
[1 2]]
Ziel:
[[0 1]
[1 0]
[2 0]
[0 0]
[2 1]]
Anzahl der korrekten Vorhersagen für D = 1: 1
Anzahl der korrekten Vorhersagen für D = 2: 2
Wenn Sie eine Zählung pro Zeile durchführen möchten, geben Sie Folgendes axis=1
an sum
:
boolarr
# array([[False, False, True],
# [ True, False, True],
# [ True, False, True]], dtype=bool)
boolarr.sum(axis=1)
# array([1, 2, 2])
Ebenso mit np.count_nonzero
:
np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])