Supongamos que tengo la siguiente lista en python:
a = [1,2,3,1,2,1,1,1,3,2,2,1]
¿Cómo encontrar el número más frecuente en esta lista de manera ordenada?
python
numpy
statistics
Justo a tiempo
fuente
fuente
np.bincount([1, 2, 3, 1, 2, 1, 1, 1, 3, 2, 2, 1]).argmax()
scipy.stats.mode
, aunque menos general.Counter(array).most_common(1)[0][0]
Puedes utilizar
Si algún elemento es tan frecuente como otro, este código devolverá solo el primer elemento.
fuente
values[counts.argmax()]
devolverá el primer valor. Para obtenerlos todos, podemos usarlosvalues[counts == counts.max()]
.Si estás dispuesto a usar SciPy :
fuente
Actuaciones (usando iPython) para algunas soluciones encontradas aquí:
Lo mejor es 'max' con 'set' para matrices pequeñas como el problema.
Según @David Sanders, si aumenta el tamaño de la matriz a algo así como 100,000 elementos, el algoritmo "max w / set" termina siendo el peor con diferencia, mientras que el método "numpy bincount" es el mejor.
fuente
a = (np.random.rand(100000) * 1000).round().astype('int'); a_list = list(a)
), su algoritmo "max w / set" termina siendo el peor con diferencia, mientras que el método "numpy bincount" es el mejor. Realicé esta prueba usando ela_list
código nativo de Python y ela
código numpy para evitar los costos de clasificación que arruinan los resultados.Además, si desea obtener el valor más frecuente (positivo o negativo) sin cargar ningún módulo, puede usar el siguiente código:
fuente
max(set(lVals), key=lVals.count)
, que cuenta un O (n) para cada elemento único delVals
aproximadamente O (n ^ 2) (suponiendo que O (n) único elementos). El usocollections.Counter(lVals).most_common(1)[0][0]
de la biblioteca estándar, como lo sugiere JoshAdel , es solo O (n).Si bien la mayoría de las respuestas anteriores son útiles, en caso de que: 1) lo necesite para admitir valores enteros no positivos (por ejemplo, flotantes o enteros negativos ;-)), y 2) no están en Python 2.7 (que colecciones. requiere), y 3) prefieren no agregar la dependencia de scipy (o incluso numpy) a su código, entonces una solución puramente python 2.6 que es O (nlogn) (es decir, eficiente) es solo esto:
fuente
Me gusta la solución de JoshAdel.
Pero solo hay una trampa.
los
np.bincount()
solución solo funciona en números.Si tiene cadenas, la
collections.Counter
solución funcionará para usted.fuente
Ampliando este método , aplicado para encontrar el modo de los datos donde puede necesitar el índice de la matriz real para ver qué tan lejos está el valor del centro de la distribución.
Recuerde descartar el modo cuando len (np.argmax (recuentos))> 1
fuente
En Python 3, lo siguiente debería funcionar:
fuente
Comenzando
Python 3.4
, la biblioteca estándar incluye lastatistics.mode
función para devolver el punto de datos más común.Si hay varios modos con la misma frecuencia,
statistics.mode
devuelve el primero encontrado.Al comenzar
Python 3.8
, lastatistics.multimode
función devuelve una lista de los valores más frecuentes en el orden en que se encontraron por primera vez:fuente
Aquí hay una solución general que puede aplicarse a lo largo de un eje, independientemente de los valores, utilizando puramente numpy. También descubrí que esto es mucho más rápido que scipy.stats.mode si hay muchos valores únicos.
fuente
Recientemente estoy haciendo un proyecto y usando colecciones. Contador (que me torturó).
El contador en colecciones tiene un muy, muy mal desempeño en mi opinión. Es solo una clase envolviendo dict ().
Lo que es peor, si usa cProfile para perfilar su método, debería ver muchas cosas '__missing__' y '__instancecheck__' desperdiciando todo el tiempo.
Tenga cuidado al usar su most_common (), porque cada vez invocaría un tipo que lo hace extremadamente lento. y si usa most_common (x), invocará una ordenación de montón, que también es lenta.
Por cierto, el bincount de numpy también tiene un problema: si usa np.bincount ([1,2,4000000]), obtendrá una matriz con 4000000 elementos.
fuente