Supposons que j'ai la liste suivante en python:
a = [1,2,3,1,2,1,1,1,3,2,2,1]
Comment trouver le numéro le plus fréquent dans cette liste de manière soignée?
python
numpy
statistics
JustInTime
la source
la source
np.bincount([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1]).argmax()
scipy.stats.mode
, bien que moins général.Counter(array).most_common(1)[0][0]
Vous pouvez utiliser
Si un élément est aussi fréquent qu'un autre, ce code ne retournera que le premier élément.
la source
values[counts.argmax()]
renvoie la première valeur. Pour les obtenir tous, nous pouvons utiliservalues[counts == counts.max()]
.Si vous souhaitez utiliser SciPy :
la source
Performances (avec iPython) pour certaines solutions trouvées ici:
Le mieux est «max» avec «set» pour les petits tableaux comme le problème.
Selon @David Sanders, si vous augmentez la taille du tableau à quelque chose comme 100 000 éléments, l'algorithme "max w / set" finit par être de loin le pire alors que la méthode "numpy bincount" est la meilleure.
la source
a = (np.random.rand(100000) * 1000).round().astype('int'); a_list = list(a)
), votre algorithme "max w / set" finit par être de loin le pire alors que la méthode "numpy bincount" est la meilleure. J'ai effectué ce test en utilisanta_list
du code python natif eta
du code numpy pour éviter que les coûts de marshalling ne gâchent les résultats.De plus, si vous souhaitez obtenir la valeur la plus fréquente (positive ou négative) sans charger de modules, vous pouvez utiliser le code suivant:
la source
max(set(lVals), key=lVals.count)
, qui fait un compte O (n) pour chaque élément unique delVals
pour approximativement O (n ^ 2) (en supposant que O (n) unique éléments). L'utilisationcollections.Counter(lVals).most_common(1)[0][0]
de la bibliothèque standard, comme suggéré par JoshAdel , n'est que O (n).Bien que la plupart des réponses ci-dessus soient utiles, au cas où vous: 1) en auriez besoin pour prendre en charge des valeurs entières non positives (par exemple, des nombres flottants ou des entiers négatifs ;-)), et 2) ne sont pas sur Python 2.7 (quelles collections. requiert), et 3) préférez ne pas ajouter la dépendance de scipy (ou même numpy) à votre code, alors une solution purement python 2.6 qui est O (nlogn) (c'est-à-dire efficace) est juste ceci:
la source
J'aime la solution de JoshAdel.
Mais il n'y a qu'un seul hic.
La
np.bincount()
solution ne fonctionne que sur les nombres.Si vous avez des chaînes, la
collections.Counter
solution fonctionnera pour vous.la source
Extension de cette méthode , appliquée à la recherche du mode des données pour lequel vous pouvez avoir besoin de l'index du tableau réel pour voir à quelle distance la valeur est du centre de la distribution.
N'oubliez pas de supprimer le mode lorsque len (np.argmax (count))> 1
la source
Dans Python 3, les éléments suivants devraient fonctionner:
la source
À partir de
Python 3.4
, la bibliothèque standard inclut lastatistics.mode
fonction pour renvoyer le point de données le plus courant.S'il existe plusieurs modes avec la même fréquence,
statistics.mode
renvoie le premier rencontré.À partir de
Python 3.8
, lastatistics.multimode
fonction renvoie une liste des valeurs les plus fréquentes dans l'ordre dans lequel elles ont été rencontrées pour la première fois:la source
Voici une solution générale qui peut être appliquée le long d'un axe, quelles que soient les valeurs, en utilisant purement numpy. J'ai également trouvé que c'est beaucoup plus rapide que scipy.stats.mode s'il y a beaucoup de valeurs uniques.
la source
Je fais récemment un projet et j'utilise des collections.Counter (ce qui m'a torturé).
Le compteur dans les collections a une très très mauvaise performance à mon avis. C'est juste une classe enveloppant dict ().
Ce qui est pire, si vous utilisez cProfile pour profiler sa méthode, vous devriez voir beaucoup de choses '__missing__' et '__instancecheck__' gaspiller tout le temps.
Soyez prudent en utilisant son most_common (), car à chaque fois il invoquerait un tri qui le rend extrêmement lent. et si vous utilisez most_common (x), il invoquera un tri de tas, qui est également lent.
Btw, bincount de numpy a aussi un problème: si vous utilisez np.bincount ([1,2,4000000]), vous obtiendrez un tableau avec 4000000 éléments.
la source