Использование массивов Numpy в качестве таблиц поиска

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

Какой наилучший (наиболее Numpythonic) способ сопоставления вверх строки в первой таблице со значениями во второй?

8
задан endolith 1 July 2015 в 00:53
поделиться

2 ответа

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

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.     ]])    
8
ответ дан 5 December 2019 в 13:59
поделиться

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

Для примера Вебьорна Льосы:

поиск:

>>> 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.     ]])
4
ответ дан 5 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: