поиск ближайших элементов в двух списках / массивах в Python
У меня есть два массиваx
а такжеy
содержащие значения с плавающей точкой. Для каждого значения вx
Я хочу найти ближайший элемент вy
без повторного использования элементов изy
, Выходными данными должно быть отображение 1-1 индексов элементов от x на индексы элементов от y. Вот'плохой способ сделать это, полагаясь на сортировку. Он удаляет каждый элемент, который был спарен из списка. Без сортировки это было бы плохо, поскольку спаривание зависело бы от порядка исходных входных массивов.
def min_i(values):
min_index, min_value = min(enumerate(values),
key=operator.itemgetter(1))
return min_index, min_value
# unsorted elements
unsorted_x = randn(10)*10
unsorted_y = randn(10)*10
# sort lists
x = sort(unsorted_x)
y = sort(unsorted_y)
pairs = []
indx_to_search = range(len(y))
for x_indx, x_item in enumerate(x):
if len(indx_to_search) == 0:
print "ran out of items to match..."
break
# until match is found look for closest item
possible_values = y[indx_to_search]
nearest_indx, nearest_item = min_i(possible_values)
orig_indx = indx_to_search[nearest_indx]
# remove it
indx_to_search.remove(orig_indx)
pairs.append((x_indx, orig_indx))
print "paired items: "
for k,v in pairs:
print x[k], " paired with ", y[v]
Я предпочитаю делать это без предварительной сортировки элементов, но если они отсортированы, то я хочу получить индексы в исходных, несортированных списках,unsorted_x
unsorted_y
, какие'лучший способ сделать это в Numpy / Scipy / Python или с помощью панд? Благодарю.
редактировать: уточнить яя не пытаюсь найти наилучшее соответствие всем элементам (например, не сводя к минимуму сумму расстояний), а лучше всего подхожу для каждого элемента, и это 'хорошо, если этоИногда за счет других элементов. Я предполагаю чтоy
как правило, намного больше, чемx
вопреки приведенному выше примеру и такS обычно много очень хорошо подходит для каждого значенияx
вy
и я просто хочу найти это эффективно.
может кто-нибудь показать пример scipy kdtrees для этого? Документы довольно скудны
kdtree = scipy.spatial.cKDTree([x,y])
kdtree.query([-3]*10) # ?? unsure about what query takes as arg