поиск ближайших элементов в двух списках / массивах в 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_xunsorted_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

Ответы на вопрос(1)

Ваш ответ на вопрос