2010-08-19 3 views
8

У меня есть 2D массив данных Numpy, считанных из CSV-файла. Каждая строка представляет собой точку данных с последним столбцом, содержащим «ключ», который однозначно соответствует «ключу» в другом массиве Numpy - «таблице поиска».Использование массивов Numpy в качестве справочных таблиц

Каков наилучший способ (наиболее многожильный) способ совпадения строк в первой таблице со значениями во втором?

+0

Ответ с поиском 'dict' это круто, но это очень неэффективно для больших таблиц поиска. Если вы хотите «искать» значения, вы можете использовать 'np.interp' с' xp' в качестве ваших ключей поиска и 'fp' в качестве ваших значений (которые должны быть поплавками, я думаю ...). Таким образом, поиск выполняется в native 'numpy' вместо итерации python (скажем, вы хотите поместить большое изображение через таблицу поиска, например, с помощью цветовой карты). –

ответ

7

Некоторые примеры данных:

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

Построить словарь от ключа номер строки в таблице поиска:

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

Затем вы можете использовать словарь, чтобы соответствовать линиям. Например, если вы просто хотите, чтобы присоединиться к таблицам:

>>> 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, создание вспомогательного дикта, очевидно, путь. –

+0

+1 за получение +1 от Alex Martelli;) И за полезный ответ, конечно. –

+2

Для этого стоит встроенная функция numpy: 'numpy.lib.recfunctions.join_by'. http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826 Это довольно неуклюже, если вы еще не используете структурированные массивы. –

3

В частном случае, когда индекс может быть вычислен с помощью клавиш, словарь можно избежать. Это преимущество, когда можно выбрать ключ таблицы поиска.

Например Vebjørn Ljosa в:

поиска:

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

слияния:

>>> 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.  ]]) 
Смежные вопросы