2010-08-19 8 views
8

Ich habe ein 2D-Array von Numpy-Daten, die aus einer CSV-Datei gelesen werden. Jede Zeile stellt einen Datenpunkt dar, wobei die letzte Spalte einen 'Schlüssel' enthält, der eindeutig einem 'Schlüssel' in einem anderen Numpy-Array entspricht - der 'Nachschlagetabelle' sozusagen.Verwenden von Numpy-Arrays als Nachschlagetabellen

Was ist die beste (am Numpythonisch) Art und Weise, die Zeilen in der ersten Tabelle mit den Werten in der zweiten Tabelle in Übereinstimmung zu bringen?

+0

Die Antwort mit einer Lookup 'dict' ist cool, aber es ist sehr ineffektiv für große Lookup-Tabellen. Wenn Sie Werte "suchen" wollen, können Sie 'np.interp' mit' xp' als Suchschlüssel und 'fp' als Ihre Werte verwenden (die Floats sein müssen, denke ich ...). Auf diese Weise erfolgt das Nachschlagen in nativer 'numpy' anstelle von Python-Iteration (z. B. wenn Sie ein großes Bild durch eine Nachschlagetabelle legen möchten, z. B. durch Anwenden einer Farbkarte). –

Antwort

7

Einige Beispieldaten:

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

Bauen Sie ein Wörterbuch aus Schlüsselnummer in der Lookup-Tabelle Zeile:

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

Dann können Sie das Wörterbuch verwenden Linien zusammenpassen. Zum Beispiel möchten, wenn Sie nur die Tabellen verknüpfen:

>>> 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, ein Hilfsdikt zu bauen ist eindeutig der Weg zu gehen. –

+0

+1 für +1 von Alex Martelli;) Und für eine nützliche Antwort natürlich. –

+2

Für was auch immer es sich lohnt, gibt es eine eingebaute numpy Funktion, um dies zu tun: 'numpy.lib.recfunctions.join_by'. http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826 Es ist ziemlich klobig, wenn Sie nicht bereits strukturierte Arrays verwenden. –

3

Im speziellen Fall, wenn der Index von den Tasten berechnet werden kann, kann das Wörterbuch vermieden werden. Es ist ein Vorteil, wenn der Schlüssel der Nachschlagetabelle ausgewählt werden kann.

Für Vebjørn Ljosa Vorbild:

Lookup:

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

merge:

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