Gibt es in numpy
/ scipy
eine effiziente Möglichkeit, Frequenzzählungen für eindeutige Werte in einem Array abzurufen?
Etwas in diese Richtung:
x = array( [1,1,1,2,2,2,5,25,1,1] )
y = freq_count( x )
print y
>> [[1, 5], [2,3], [5,1], [25,1]]
(Für Sie, R-Benutzer da draußen, suche ich im Grunde nach der table()
Funktion)
collections.Counter(x)
ausreichendAntworten:
Schauen Sie sich an
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
Und dann:
oder:
oder wie auch immer Sie die Anzahl und die eindeutigen Werte kombinieren möchten.
quelle
Ab Numpy 1.9 ist die einfachste und schnellste Methode die einfache Verwendung
numpy.unique
, die jetzt einreturn_counts
Schlüsselwortargument enthält:Welches gibt:
Ein schneller Vergleich mit
scipy.stats.itemfreq
:quelle
return_counts
Schlüsselwortargument nicht vorhanden, was die Ausnahme erklären könnte. In diesem Fall schlagen die Dokumente vor , dass diesnp.unique(x, True)
äquivalent zu istnp.unique(x, return_index=True)
, was keine Anzahl zurückgibt.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Als diese Funktion hinzugefügt wurde (siehe hier ), wurde bei einigen informellen Testsreturn_counts
mehr als fünfmal schneller getaktet.Update: Die in der ursprünglichen Antwort erwähnte Methode ist veraltet. Wir sollten stattdessen den neuen Weg verwenden:
Ursprüngliche Antwort:
Sie können scipy.stats.itemfreq verwenden
quelle
Das hat mich auch interessiert, also habe ich einen kleinen Leistungsvergleich durchgeführt (mit perfplot , einem meiner Lieblingsprojekte ). Ergebnis:
ist bei weitem der schnellste. (Beachten Sie die Protokollskalierung.)
Code zum Generieren des Plots:
quelle
equality_check=array_sorteq
in hinzufügteperfplot.show()
. Was einen Fehler verursachte (in Python 2) warpd.value_counts
(auch mit sort = False).Pandas-Modul verwenden:
quelle
Dies ist bei weitem die allgemeinste und performanteste Lösung; überrascht, dass es noch nicht veröffentlicht wurde.
Im Gegensatz zur derzeit akzeptierten Antwort funktioniert es mit jedem Datentyp, der sortierbar ist (nicht nur mit positiven Ints), und bietet eine optimale Leistung. Der einzige erhebliche Aufwand liegt in der Sortierung nach np.unique.
quelle
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
ist die wahrscheinlich beste Wahl. Wenn Ihr Array etwas anderes als kleine dichte Ganzzahlen enthält, kann es nützlich sein, es wie folgt zu verpacken:Beispielsweise:
quelle
Obwohl es bereits beantwortet wurde, schlage ich einen anderen Ansatz vor, der davon Gebrauch macht
numpy.histogram
. Eine solche Funktion gibt bei einer Sequenz die Häufigkeit ihrer in Bins gruppierten Elemente zurück .Beachten Sie jedoch, dass dies in diesem Beispiel funktioniert, da Zahlen Ganzzahlen sind. Wenn sie reelle Zahlen wären, würde diese Lösung nicht so gut zutreffen.
quelle
Dies gibt Ihnen: {1: 5, 2: 3, 5: 1, 25: 1}
quelle
collections.Counter(x)
Geben Sie auch das gleiche Ergebnis. Ich glaube, das OP möchte einen Ausgang, der der R-table
Funktion ähnelt . Das zu behaltenSeries
kann nützlicher sein.pd.Series(x).reshape(-1)
wenn es sich um ein mehrdimensionales Array handelt.Um eindeutige Nicht-Ganzzahlen zu zählen - ähnlich wie bei Eelco Hoogendoorn, aber erheblich schneller (Faktor 5 auf meinem Computer) - habe ich früher mit etwas C-Code
weave.inline
kombiniertnumpy.unique
.Profil Information
Eelcos reine
numpy
Version:Hinweis
Hier gibt es Redundanz (
unique
führt auch eine Sortierung durch), was bedeutet, dass der Code wahrscheinlich weiter optimiert werden könnte, indem dieunique
Funktionalität in die C-Code-Schleife eingefügt wird.quelle
Alte Frage, aber ich möchte meine eigene Lösung bereitstellen, die sich als die schnellste herausstellt. Verwenden Sie normal
list
anstelle vonnp.array
als Eingabe (oder zuerst zur Liste übertragen), basierend auf meinem Bench-Test.Probieren Sie es aus, wenn Sie auch darauf stoßen.
Beispielsweise,
100000 Schleifen, am besten 3: 2,26 µs pro Schleife
100000 Schleifen, am besten 3: 8,8 µs pro Schleife
100000 Schleifen, am besten 3: 5,85 µs pro Schleife
Während die akzeptierte Antwort langsamer wäre und die
scipy.stats.itemfreq
Lösung noch schlechter ist.Eine eingehendere Prüfung bestätigte die formulierte Erwartung nicht.
Ref. Kommentare unten zu Cache und anderen In-RAM-Nebenwirkungen, die einen kleinen Datensatz beeinflussen, der sich massiv wiederholt.
quelle
numpy
nicht unbedingt den richtigen Weg darstellt.so etwas sollte es tun:
Außerdem scheint dieser vorherige Beitrag über das effiziente Zählen eindeutiger Elemente Ihrer Frage ziemlich ähnlich zu sein, es sei denn, ich vermisse etwas.
quelle
mehrdimensionale Frequenzzählung, dh Zählen von Arrays.
quelle
quelle
quelle