una tutorial transpuesta tamaño multiplicacion matriz matrices español elementos ejemplos arreglos arreglo array agregar python numpy scipy

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)