2010-08-19 14 views
8

Ho un array 2D di dati Numpy letti da un file .csv. Ogni riga rappresenta un punto dati con la colonna finale contenente una "chiave" che corrisponde in modo univoco a "chiave" in un altro array Numpy, la "tabella di ricerca".Utilizzo degli array Numpy come tabelle di ricerca

Qual è il modo migliore (più Numpythonic) per abbinare le linee nella prima tabella con i valori nel secondo?

+0

La risposta con una ricerca 'dict' è fresco, ma è molto inefficace per grandi tabelle di ricerca. Se vuoi "cercare" i valori, puoi usare 'np.interp' con' xp' come chiavi di ricerca e 'fp' come valori (che devono essere float, suppongo ...). In questo modo la ricerca viene eseguita in 'numpy 'nativo invece che in iterazione python (diciamo che vuoi inserire un'immagine grande attraverso una tabella di ricerca, ad esempio applicando una mappa dei colori). –

risposta

7

Alcuni dati esempio:

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]]) 

Costruire un dizionario da chiave a fila di numeri nella tabella di ricerca:

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

quindi è possibile utilizzare il dizionario per abbinare linee. Per esempio, se si desidera solo per unire le tabelle:

>>> 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, costruire un ditt ausiliario è chiaramente la strada da percorrere. –

+0

+1 per ottenere +1 da Alex Martelli;) E per avere una risposta utile, ovviamente. –

+2

Per qualsiasi valore, esiste una funzione numpy incorporata per eseguire questa operazione: 'numpy.lib.recfunctions.join_by'. http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826 È piuttosto goffo se non stai già utilizzando gli array strutturati. –

3

Nel caso particolare in cui l'indice può essere calcolato dai tasti, il dizionario può essere evitato. È un vantaggio quando si può scegliere la chiave della tabella di ricerca.

Per esempio di Vebjørn Ljosa:

ricerca:

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

unione:

>>> 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.  ]])