2010-08-19 14 views
8

Tengo una matriz 2D de datos de Numpy leídos de un archivo .csv. Cada fila representa un punto de datos con la columna final que contiene una 'clave' que corresponde únicamente a 'clave' en otra matriz Numpy, la 'tabla de búsqueda' por así decirlo.Uso de matrices Numpy como tablas de búsqueda

¿Cuál es la mejor forma (la más numpythonic) de hacer coincidir las líneas en la primera tabla con los valores en la segunda?

+0

La respuesta a una búsqueda 'dict' es fresco, pero es muy ineficaz para grandes tablas de búsqueda. Si desea valores de "búsqueda", puede usar 'np.interp' con' xp' como claves de búsqueda y 'fp' como sus valores (que deben ser flotantes, supongo ...). De esta forma, la búsqueda se realiza en "numpy" nativo en lugar de la iteración de Python (supongamos que desea colocar una imagen grande a través de una tabla de búsqueda, por ejemplo, aplicando un mapa de color). –

Respuesta

7

Algunos datos de ejemplo:

import numpy as np 

lookup = np.array([[ 1.  , 3.14 , 4.14 ], 
        [ 2.  , 2.71818, 3.7 ], 
        [ 3.  , 42.  , 43.  ]]) 

a = np.array([[ 1, 11], 
       [ 1, 12], 
       [ 2, 21], 
       [ 3, 31]]) 

Construir un diccionario de la llave a la fila número en la tabla de búsqueda:

mapping = dict(zip(lookup[:,0], range(len(lookup)))) 

continuación, puede utilizar el diccionario para que coincida con las líneas. Por ejemplo, si lo que desea es combinar las tablas:

>>> np.hstack((a, np.array([lookup[mapping[key],1:] 
          for key in a[:,0]]))) 
array([[ 1.  , 11.  , 3.14 , 4.14 ], 
     [ 1.  , 12.  , 3.14 , 4.14 ], 
     [ 2.  , 21.  , 2.71818, 3.7 ], 
     [ 3.  , 31.  , 42.  , 43.  ]])  
+0

+1, construir un dict auxiliar es claramente el camino a seguir. –

+0

+1 para obtener +1 de Alex Martelli;) Y por tener una respuesta útil, por supuesto. –

+2

Para lo que sea, hay una función numpy incorporada para hacer esto: 'numpy.lib.recfunctions.join_by'. http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826 Sin embargo, es bastante torpe si no estás usando arrays estructurados. –

3

En el caso especial cuando el índice se puede calcular a partir de las teclas, el diccionario se pueden evitar. Es una ventaja cuando se puede elegir la clave de la tabla de búsqueda.

Por ejemplo de Vebjørn Ljosa:

de búsqueda:

>>> lookup[a[:,0]-1, :] 
array([[ 1.  , 3.14 , 4.14 ], 
     [ 1.  , 3.14 , 4.14 ], 
     [ 2.  , 2.71818, 3.7 ], 
     [ 3.  , 42.  , 43.  ]]) 

fusión:

>>> np.hstack([a, lookup[a[:,0]-1, :]]) 
array([[ 1.  , 11.  , 1.  , 3.14 , 4.14 ], 
     [ 1.  , 12.  , 1.  , 3.14 , 4.14 ], 
     [ 2.  , 21.  , 2.  , 2.71818, 3.7 ], 
     [ 3.  , 31.  , 3.  , 42.  , 43.  ]]) 
Cuestiones relacionadas