Ich habe ein NumPy-Array ‘boolar’ vom booleschen Typ. Ich möchte die Anzahl der Elemente zählen, deren Werte sind True
. Gibt es eine spezielle NumPy- oder Python-Routine für diese Aufgabe? Oder muss ich die Elemente in meinem Skript durchlaufen?
So zählen Sie die Anzahl der wahren Elemente in einem NumPy-bool-Array
norio
David Alber
Sie haben mehrere Möglichkeiten. Zwei Optionen sind die folgenden.
boolarr.sum()
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)
>>> boolarr.sum()
5
Natürlich ist das eine bool
-spezifische Antwort. Allgemeiner können Sie verwenden numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
-
Danke, David. Sie sehen ordentlich aus. Über die Methode mit sum (..), ist True immer gleich 1 in Python (oder zumindest in Numpy)? Wenn es nicht garantiert ist, werde ich vorher ein Häkchen hinzufügen, ‘if True==1:’. Über count_nonzero(..) scheint es leider nicht in meinem numpy-Modul in Version 1.5.1 implementiert zu sein, aber ich habe möglicherweise die Möglichkeit, es in Zukunft zu verwenden.
– norio
3. Dezember 2011 um 1:52 Uhr
-
@norio Bezüglich
bool
: Boolesche Werte werden in arithmetischen Operationen als 1 und 0 behandelt. Sehen “Boolesche Werte” in der Dokumentation zur Python-Standardbibliothek. Beachten Sie, dass NumPy’sbool
und Pythonbool
sind nicht gleich, aber sie sind kompatibel (vgl hier für mehr Informationen).– David Alber
3. Dezember 2011 um 4:39 Uhr
-
@norio Bezüglich
numpy.count_nonzero
nicht in NumPy v1.5.1: Sie haben Recht. Demzufolge Freigabeankündigunges wurde in NumPy v1.6.0 hinzugefügt.– David Alber
3. Dezember 2011 um 4:41 Uhr
-
FWIW,
numpy.count_nonzero
ist ungefähr tausendmal schneller, zumindest in meinem Python-Interpreter.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)"
– chbraun
19. November 2013 um 21:10 Uhr
-
@chbrown du hast recht. Aber man sollte vergleichen
np.sum(bools)
stattdessen! Jedoch,np.count_nonzero(bools)
ist immer noch ~12x schneller.– mab
23. November 2015 um 18:15 Uhr
Guillaume Gendré
Diese Frage löste eine ziemlich ähnliche Frage für mich und ich dachte, ich sollte sie teilen:
In rohem 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...
-
Sie sollten das Array von Arrays zuerst “glätten”. Leider gibt es keine eingebaute Methode, siehe stackoverflow.com/questions/2158395/…
– Tommy Chheng
7. Dezember 2012 um 23:32 Uhr
-
Danke Guillaume! Funktioniert auch mit Pandas-Datenrahmen.
– JJFord3
1. Dezember 2016 um 19:11 Uhr
In Bezug auf den Vergleich zweier numpy-Arrays und das Zählen der Anzahl der Ü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-Maß erweitert werden kann.
Die Ergebnisse sind:
Vorhersage:
[[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 richtigen Vorhersagen für D=2: 2
boolarr.sum(axis=1 or axis=0)
Achse = 1 gibt die Anzahl der Wahren in einer Reihe aus und Achse = 0 zählt die Anzahl der Wahren in Spalten
boolarr[[true,true,true],[false,false,true]]
print(boolarr.sum(axis=1))
wird (3,1)
b[b].size
wo b
ist der boolesche ndarray in Frage. Es filtert b
zum True
und zählen Sie dann die Länge des gefilterten Arrays.
Dies ist wahrscheinlich nicht so effizient np.count_nonzero()
bereits erwähnt, ist aber nützlich, wenn Sie die andere Syntax vergessen. Außerdem spart diese kürzere Syntax dem Programmierer Zeit.
Demo:
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
Josef Pablo Solano
Für 1D-Array hat das bei mir funktioniert:
import numpy as np
numbers= np.array([3, 1, 5, 2, 5, 1, 1, 5, 1, 4, 2, 1, 4, 5, 3, 4,
5, 2, 4, 2, 6, 6, 3, 6, 2, 3, 5, 6, 5])
numbersGreaterThan2= np.count_nonzero(numbers> 2)
Für Pandas: stackoverflow.com/questions/26053849/…
– Privatgelände
3. April 2017 um 8:16 Uhr