У меня есть два массива A
и B
формы (m, 2)
и (n, 2)
, соответственно, с n >> m
. В моем случае n = 8013
и m = 71
. Каждая строка (x, y)
каждого массива представляет координаты точечного источника на астрономическом изображении в пиксельных единицах. Все строки в A
имеют очень близкие значения к некоторым из строк B
, но не совсем такие же. В некоторых случаях разница заключается в некоторых десятичных дробях, в других, возможно, в одном или двух целых числах, например, одна строка в A
- (1158, 1304.8974)
, а соответствующая ей строка в B - (1160, 1304.6578)
.
Мой вопрос: : как найти индексы элементов в B
, которые являются ближайшими к элементам в A
?
Моя первая попытка:
matched = []
indexes = []
for k in np.arange(0, len(A)):
idx = np.where((B[:, 0].astype(int) == A[k, 0].astype(int)) &
(B[:, 1].astype(int) == A[k, 1].astype(int)))
matched.append(B[idx])
indexes.append(idx)
Но это только возвращает индексы строк в A
, целые числа которых точно такие же, как элементы в B
, и, следовательно, не соответствуют всем элементам. Если я удалю astype(int)
, у меня будет еще меньше совпадений.
Вторая попытка, которую я пробовал, для одной строки:
value = A[0]
X = np.abs(B - value)
idx = np.where(X == X.min())
B[idx[0]]
Но вычисляются только самые близкие значение столбца x
или y
, но не обоих. Это означает, что если у меня есть одна строка в A
, которую я хочу сопоставить, например (1230, 980)
, и две строки в B
, например (3450, 981)
и (1233, 975)
, последняя является правильным соответствием и ожидаемым output, эта вторая реализация возвращает элемент (3450, 981)
в качестве правильного совпадения с (1230, 980)
, поскольку точка y = 980
ближе к y = 981
, чем к y = 975
.