Angenommen, ich habe die folgende Liste in Python:
a = [1,2,3,1,2,1,1,1,3,2,2,1]
Wie finde ich die häufigste Nummer in dieser Liste auf übersichtliche Weise?
python
numpy
statistics
Gerade rechtzeitig
quelle
quelle
np.bincount([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1]).argmax()
scipy.stats.mode
, wenn auch weniger allgemein.Counter(array).most_common(1)[0][0]
Sie können verwenden
Wenn ein Element so häufig ist wie ein anderes, gibt dieser Code nur das erste Element zurück.
quelle
values[counts.argmax()]
wird der erste Wert zurückgegeben. Um sie alle zu bekommen, können wir verwendenvalues[counts == counts.max()]
.Wenn Sie bereit sind, SciPy zu verwenden :
quelle
Performances (mit iPython) für einige Lösungen finden Sie hier:
Am besten ist 'max' mit 'set' für kleine Arrays wie das Problem.
Laut @David Sanders ist der Algorithmus "max w / set" bei weitem der schlechteste , wenn Sie die Arraygröße auf etwa 100.000 Elemente erhöhen, während die Methode "numpy bincount" die beste ist.
quelle
a = (np.random.rand(100000) * 1000).round().astype('int'); a_list = list(a)
) erhöhen , ist Ihr "max w / set" -Algorithmus bei weitem der schlechteste, während die "numpy bincount" -Methode die beste ist. Ich habe diesen Test mita_list
nativem Python-Code unda
numpy-Code durchgeführt, um zu vermeiden, dass die Kosten für das Marshalling die Ergebnisse verfälschen.Auch wenn Sie den häufigsten Wert (positiv oder negativ) erhalten möchten, ohne Module zu laden, können Sie den folgenden Code verwenden:
quelle
max(set(lVals), key=lVals.count)
, bei dem für jedes eindeutige Element eine O (n) -Zählung vonlVals
ungefähr O (n ^ 2) durchgeführt wird (unter der Annahme, dass O (n) eindeutig ist Elemente). Die Verwendungcollections.Counter(lVals).most_common(1)[0][0]
aus der Standardbibliothek, wie von JoshAdel vorgeschlagen , ist nur O (n).Während die meisten der obigen Antworten nützlich sind, falls Sie: 1) nicht positive ganzzahlige Werte (z. B. Gleitkommazahlen oder negative Ganzzahlen ;-)) unterstützen müssen und 2) nicht in Python 2.7 (welche Sammlungen.Counter) enthalten sind erfordert), und 3) ziehen Sie es vor, die Abhängigkeit von scipy (oder sogar numpy) nicht zu Ihrem Code hinzuzufügen, dann ist eine reine Python 2.6-Lösung, die O (nlogn) (dh effizient) ist, genau dies:
quelle
Ich mag die Lösung von JoshAdel.
Aber es gibt nur einen Haken.
Das
np.bincount()
Lösung funktioniert nur mit Zahlen.Wenn Sie Zeichenfolgen haben,
collections.Counter
funktioniert die Lösung für Sie.quelle
Erweitern Sie diese Methode , um den Modus der Daten zu ermitteln, in dem Sie möglicherweise den Index des tatsächlichen Arrays benötigen, um zu sehen, wie weit der Wert vom Zentrum der Verteilung entfernt ist.
Denken Sie daran, den Modus zu verwerfen, wenn len (np.argmax (Anzahl))> 1 ist
quelle
In Python 3 sollte Folgendes funktionieren:
quelle
Beginnend enthält
Python 3.4
die Standardbibliothek diestatistics.mode
Funktion, den häufigsten Datenpunkt zurückzugeben.Wenn mehrere Modi mit derselben Frequenz vorhanden sind, wird
statistics.mode
der erste gefundene zurückgegeben.Beginnend
Python 3.8
gibt diestatistics.multimode
Funktion eine Liste der am häufigsten vorkommenden Werte in der Reihenfolge zurück, in der sie zuerst angetroffen wurden:quelle
Hier ist eine allgemeine Lösung, die unabhängig von den Werten mit nur Numpy entlang einer Achse angewendet werden kann. Ich habe auch festgestellt, dass dies viel schneller ist als scipy.stats.mode, wenn es viele eindeutige Werte gibt.
quelle
Ich mache vor kurzem ein Projekt und benutze Sammlungen. Counter. (Was mich gefoltert hat).
Der Counter in Sammlungen hat meiner Meinung nach eine sehr sehr schlechte Leistung. Es ist nur ein Klassenumbruch-Diktat ().
Was noch schlimmer ist: Wenn Sie cProfile verwenden, um die Methode zu profilieren, sollten Sie die ganze Zeit über eine Menge '__missing__' und '__instancecheck__' Dinge verschwenden.
Seien Sie vorsichtig, wenn Sie most_common () verwenden, da es jedes Mal eine Sortierung aufruft, die es extrem langsam macht. und wenn Sie most_common (x) verwenden, wird eine Heap-Sortierung aufgerufen, die ebenfalls langsam ist.
Übrigens hat der Bincount von numpy auch ein Problem: Wenn Sie np.bincount ([1,2,4000000]) verwenden, erhalten Sie ein Array mit 4000000 Elementen.
quelle