En numpy
/ scipy
, ¿hay una manera eficiente de obtener conteos de frecuencia para valores únicos en una matriz?
Algo en este sentido:
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]]
(Para ustedes, usuarios de R, básicamente estoy buscando la table()
función)
collections.Counter(x)
suficiente?Respuestas:
Echa un vistazo a
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
Y entonces:
o:
o como quiera combinar los recuentos y los valores únicos.
fuente
A partir de Numpy 1.9, el método más fácil y rápido es simplemente usar
numpy.unique
, que ahora tiene unreturn_counts
argumento de palabra clave:Lo que da:
Una comparación rápida con
scipy.stats.itemfreq
:fuente
return_counts
argumento de la palabra clave no existía, lo que podría explicar la excepción. En ese caso, los documentos sugieren quenp.unique(x, True)
es equivalente anp.unique(x, return_index=True)
, que no devuelve conteos.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Cuando se agregó esta función (ver aquí ), algunas pruebas informales tuvieron el uso delreturn_counts
reloj más de 5 veces más rápido.Actualización: El método mencionado en la respuesta original está en desuso, en su lugar deberíamos usar la nueva forma:
Respuesta original:
puedes usar scipy.stats.itemfreq
fuente
También estaba interesado en esto, así que hice una pequeña comparación de rendimiento (usando perfplot , un proyecto mío mío). Resultado:
Es, con mucho, el más rápido. (Tenga en cuenta la escala de registro).
Código para generar la trama:
fuente
equality_check=array_sorteq
deperfplot.show()
. Lo que estaba causando un error (en Python 2) fuepd.value_counts
(incluso con sort = False).Usando el módulo de pandas:
fuente
Esta es, con mucho, la solución más general y eficaz; sorprendido no ha sido publicado todavía.
A diferencia de la respuesta actualmente aceptada, funciona en cualquier tipo de datos que se pueda ordenar (no solo en entradas positivas), y tiene un rendimiento óptimo; el único gasto significativo está en la clasificación realizada por np.unique.
fuente
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
Es probablemente la mejor opción. Si su matriz contiene algo además de pequeños enteros densos, podría ser útil envolverla de esta manera:Por ejemplo:
fuente
Aunque ya ha sido respondido, sugiero un enfoque diferente que hace uso de
numpy.histogram
. Dicha función, dada una secuencia, devuelve la frecuencia de sus elementos agrupados en contenedores .Sin embargo, tenga cuidado : funciona en este ejemplo porque los números son enteros. Si fueran números reales, entonces esta solución no se aplicaría tan bien.
fuente
Esto le da: {1: 5, 2: 3, 5: 1, 25: 1}
fuente
collections.Counter(x)
También dan el mismo resultado. Creo que el OP quiere una salida que se parezca a latable
función R. Mantener elSeries
puede ser más útil.pd.Series(x).reshape(-1)
si se trata de una matriz multidimensional.Para contar números no enteros únicos , similar a la respuesta de Eelco Hoogendoorn pero considerablemente más rápido (factor 5 en mi máquina), solía
weave.inline
combinarmenumpy.unique
con un poco de código c;Información de perfil
La
numpy
versión pura de Eelco :Nota
Aquí hay redundancia (también se
unique
realiza una ordenación), lo que significa que el código probablemente podría optimizarse aún más al poner launique
funcionalidad dentro del bucle de código C.fuente
Antigua pregunta, pero me gustaría proporcionar mi propia solución que resulte ser la más rápida, usar normal en
list
lugar denp.array
como entrada (o transferir a la lista en primer lugar), según mi prueba de banco.Compruébalo si te encuentras con él también.
Por ejemplo,
100000 bucles, lo mejor de 3: 2.26 µs por bucle
100000 bucles, lo mejor de 3: 8.8 µs por bucle
100000 bucles, lo mejor de 3: 5.85 µs por bucle
Si bien la respuesta aceptada sería más lenta, y la
scipy.stats.itemfreq
solución es aún peor.Una prueba más profunda no confirmó la expectativa formulada.
Árbitro. Los comentarios a continuación sobre el caché y otros efectos secundarios en la RAM que influyen en un pequeño conjunto de datos son resultados de pruebas masivamente repetitivos.
fuente
numpy
que no es necesariamente el camino a seguir.algo como esto debería hacerlo:
Además, esta publicación anterior sobre el conteo eficiente de elementos únicos parece bastante similar a su pregunta, a menos que me falte algo.
fuente
recuento de frecuencia multidimensional, es decir, recuento de matrices.
fuente
fuente
fuente