У меня есть двумерный массив данных Numpy, считанный из файла .csv. Каждая строка представляет точку данных с последним столбцом, содержащим «ключ», который однозначно соответствует «ключу» в другом массиве Numpy - «поисковой таблице».
Какой наилучший (наиболее Numpythonic) способ сопоставления вверх строки в первой таблице со значениями во второй?
Некоторые примеры данных:
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. ]])
В особом случае, когда индекс может быть вычислен на основе ключей, словаря можно избежать. Это преимущество, когда можно выбрать ключ таблицы поиска.
Для примера Вебьорна Льосы:
поиск:
>>> 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. ]])