In Python habe ich ein ndarray y
, das als gedruckt wirdarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Ich versuche zu zählen, wie viele 0
s und wie viele 1
s in diesem Array vorhanden sind.
Aber wenn ich tippe y.count(0)
oder y.count(1)
, heißt es
numpy.ndarray
Objekt hat kein Attributcount
Was sollte ich tun?
python
numpy
multidimensional-array
count
mflowww
quelle
quelle
numpy.count_nonzero
.Antworten:
Nicht numpy Weg :
Verwenden Sie
collections.Counter
;quelle
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
funktionierteWas ist mit so
numpy.count_nonzero
etwas wiequelle
numpy.ndarray
wie OP ursprünglich gefragt hatte.Persönlich würde ich gehen für:
(y == 0).sum()
und(y == 1).sum()
Z.B
quelle
sum( vector==value )
Für Ihren Fall können Sie auch in numpy.bincount nachsehen
quelle
Konvertieren Sie Ihr Array
y
in eine Listel
und führen Sie dannl.count(1)
und ausl.count(0)
quelle
Wenn Sie wissen, dass sie gerecht sind
0
und1
:gibt Ihnen die Anzahl der Einsen.
np.sum(1-y)
gibt die Nullen.Für eine leichte Allgemeinheit, wenn Sie zählen möchten
0
und nicht Null (aber möglicherweise 2 oder 3):gibt die Anzahl ungleich Null an.
Aber wenn Sie etwas Komplizierteres brauchen, denke ich nicht, dass Numpy eine gute
count
Option ist. In diesem Fall gehen Sie zu Sammlungen:Das verhält sich wie ein Diktat
quelle
Wenn Sie genau wissen, nach welcher Nummer Sie suchen, können Sie Folgendes verwenden:
Gibt zurück, wie oft 2 in Ihrem Array aufgetreten ist.
quelle
Ehrlich gesagt finde ich es am einfachsten, in eine Pandas-Serie oder einen DataFrame zu konvertieren:
Oder dieser nette Einzeiler von Robert Muil:
quelle
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Niemand schlug vor,
numpy.bincount(input, minlength)
mit zu verwendenminlength = np.size(input)
, aber es scheint eine gute Lösung zu sein und definitiv die schnellste :Das ist eine verrückte Beschleunigung zwischen
numpy.unique(x, return_counts=True)
undnumpy.bincount(x, minlength=np.max(x))
!quelle
np.histogram
berechnet nicht dasselbe. Es macht keinen Sinn, die drei von mir vorgeschlagenen Ansätze mit derhistogram
Funktion zu vergleichen.bincount
funktioniert zwar nur für Ganzzahlen, daher für das OP-Problem, möglicherweise jedoch nicht für das im Titel beschriebene generische Problem. Haben Sie auch versucht,bincount
mit Arrays mit sehr großen Ints zu arbeiten?bincount
ist etwa viermal schneller alsunique
.Was ist mit
len(y[y==0])
undlen(y[y==1])
?quelle
y.tolist().count(val)
mit Wert 0 oder 1
Da eine Python-Liste eine native Funktion hat
count
, ist die Konvertierung in eine Liste vor Verwendung dieser Funktion eine einfache Lösung.quelle
Eine weitere einfache Lösung könnte darin bestehen, numpy.count_nonzero () zu verwenden :
Lassen Sie sich nicht vom Namen irreführen. Wenn Sie ihn wie im Beispiel mit dem Booleschen Wert verwenden, reicht er aus.
quelle
Um die Anzahl der Vorkommen zu zählen, können Sie Folgendes verwenden
np.unique(array, return_counts=True)
:quelle
Ich würde np.where verwenden:
quelle
Nutzen Sie die Methoden einer Serie:
quelle
Eine allgemeine und einfache Antwort wäre:
was beispielsweise zu diesem vollständigen Code führen würde
Wenn MyArray nun mehrere Dimensionen hat und Sie das Auftreten einer Werteverteilung in einer Linie zählen möchten (= Muster im Folgenden)
quelle
Sie können das Wörterbuchverständnis verwenden, um einen ordentlichen Einzeiler zu erstellen. Weitere Informationen zum Wörterbuchverständnis finden Sie hier
Dadurch wird ein Wörterbuch mit den Werten in Ihrem ndarray als Schlüssel und der Anzahl der Werte als Werte für die Schlüssel erstellt.
Dies funktioniert immer dann, wenn Sie Vorkommen eines Werts in Arrays dieses Formats zählen möchten.
quelle
Versuche dies:
quelle
Dies kann auf einfache Weise mit der folgenden Methode durchgeführt werden
quelle
Da Ihr ndarray nur 0 und 1 enthält, können Sie sum () verwenden, um das Auftreten von 1s zu ermitteln, und len () - sum (), um das Auftreten von 0s zu ermitteln.
quelle
Sie haben hier ein spezielles Array mit nur 1 und 0. Ein Trick ist also zu benutzen
Dies gibt Ihnen den Prozentsatz von 1s in Ihrem Array. Alternativ verwenden
gibt Ihnen die absolute Zahl 1 und 0 in Ihrem Array.
quelle
Ich habe gerade den Kommentar von Seppo Enarvi hier kopiert, der eine richtige Antwort verdient
quelle
Es ist ein weiterer Schritt erforderlich, aber eine flexiblere Lösung, die auch für 2D-Arrays und kompliziertere Filter funktioniert, besteht darin, eine Boolesche Maske zu erstellen und dann .sum () für die Maske zu verwenden.
quelle
Wenn Sie numpy oder ein Sammlungsmodul nicht verwenden möchten, können Sie ein Wörterbuch verwenden:
Ergebnis:
Natürlich können Sie auch eine if / else-Anweisung verwenden. Ich denke, die Zählerfunktion macht fast das Gleiche, aber das ist transparenter.
quelle
Für generische Einträge:
Gibt eine Zählung aus:
Und Indizes:
quelle
Hier habe ich etwas, anhand dessen Sie die Häufigkeit des Auftretens einer bestimmten Zahl zählen können: gemäß Ihrem Code
count_of_zero = list (y [y == 0]). count (0)
print (count_of_zero)
// Entsprechend der Übereinstimmung gibt es boolesche Werte und gemäß dem True-Wert wird die Zahl 0 zurückgegeben
quelle
Wenn Sie an der schnellsten Ausführung interessiert sind, wissen Sie im Voraus, nach welchen Werten Sie suchen müssen, und Ihr Array ist 1D, oder Sie interessieren sich anderweitig für das Ergebnis auf dem abgeflachten Array (in diesem Fall sollte die Eingabe der Funktion erfolgen sei
np.flatten(arr)
eher als nurarr
), dann ist Numba dein Freund:oder für sehr große Arrays, bei denen Parallelisierung vorteilhaft sein kann:
Vergleich dieser
np.count_nonzero()
(was auch das Problem hat, ein temporäres Array zu erstellen, das vermieden werden kann) undnp.unique()
basierter Lösungfür Eingaben generiert mit:
Die folgenden Diagramme werden erhalten (die zweite Diagrammreihe ist ein Zoom auf den schnelleren Ansatz):
Dies zeigt, dass Numba-basierte Lösungen spürbar schneller sind als die NumPy-Gegenstücke, und bei sehr großen Eingaben ist der parallele Ansatz schneller als der naive.
Vollständiger Code hier verfügbar .
quelle
Wenn Sie mit sehr großen Arrays arbeiten, die Generatoren verwenden, kann dies eine Option sein. Das Schöne daran ist, dass dieser Ansatz sowohl für Arrays als auch für Listen gut funktioniert und Sie kein zusätzliches Paket benötigen. Außerdem verwenden Sie nicht so viel Speicher.
quelle
Numpy hat dafür ein Modul. Nur ein kleiner Hack. Legen Sie Ihr Eingabearray als Bins ab.
Die Ausgabe sind 2 Arrays. Einer mit den Werten selbst, der andere mit den entsprechenden Frequenzen.
quelle
quelle