So zählen Sie die Anzahl der wahren Elemente in einem NumPy-bool-Array

Lesezeit: 3 Minuten

Benutzer-Avatar
norio

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?

  • Für Pandas: stackoverflow.com/questions/26053849/…

    – Privatgelände

    3. April 2017 um 8:16 Uhr

Benutzer-Avatar
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’s bool und Python bool 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


Benutzer-Avatar
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 Trueund 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

Benutzer-Avatar
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)

1049700cookie-checkSo zählen Sie die Anzahl der wahren Elemente in einem NumPy-bool-Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy