python - tutorial - tamaño de un arreglo numpy
Manera eficiente de contar elementos únicos en la matriz en numpy/scipy en Python (4)
Si seguir con Python 2.7 (o 3.1) no es un problema y cualquiera de estas dos versiones de Python está disponible para usted, tal vez las nuevas colecciones.Counter podría ser algo para usted si se apega a elementos hashable como tuplas:
>>> from collections import Counter
>>> c = Counter([(0,0,1), (1,1,1), (1,1,1), (1,0,1)])
>>> c
Counter({(1, 1, 1): 2, (0, 0, 1): 1, (1, 0, 1): 1})
Aunque no he hecho ninguna prueba de rendimiento en estos dos enfoques.
Tengo una matriz scipy, por ejemplo
a = array([[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]])
Quiero contar la cantidad de ocurrencias de cada elemento único en la matriz. Por ejemplo, para la matriz anterior a, deseo ver que hay 1 aparición de [0, 0, 1], 2 apariciones de [1, 1, 1] y 1 aparición de [1, 0, 1].
Una manera en que pensé hacerlo fue:
from collections import defaultdict
d = defaultdict(int)
for elt in a:
d[elt] += 1
¿hay una forma mejor / más eficiente?
Gracias.
para Python 2.6 <
import itertools
data_array = [[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]]
dict_ = {}
for list_, count in itertools.groupby(data_array):
dict_.update({tuple(list_), len(list(count))})
Puede ordenar la matriz lexicográficamente por filas y buscar los puntos donde cambian las filas:
In [1]: a = array([[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]])
In [2]: b = a[lexsort(a.T)]
In [3]: b
Out[3]:
array([[0, 0, 1],
[1, 0, 1],
[1, 1, 1],
[1, 1, 1]])
...
In [5]: (b[1:] - b[:-1]).any(-1)
Out[5]: array([ True, True, False], dtype=bool)
La última matriz dice que las primeras tres filas son diferentes y la tercera fila se repite dos veces.
Para arrays de unos y ceros puedes codificar los valores:
In [6]: bincount(dot(a, array([4,2,1])))
Out[6]: array([0, 1, 0, 0, 0, 1, 0, 2])
Los diccionarios también pueden ser utilizados. Cuál de los varios métodos será el más rápido dependerá del tipo de matrices con las que realmente está trabajando.
El paquete numpy_indexed (descargo de responsabilidad: yo soy su autor) proporciona una solución similar a la publicada por chuck; que está muy bien vectorizado. Pero con pruebas, una interfaz agradable y muchas más funciones útiles relacionadas:
import numpy_indexed as npi
npi.count(a)