2015-07-02 6 views
2

У меня есть два 2D-списка с координатами x и y, и я хочу пройти через list1, и для каждой точки найдите ближайшую (x, y) координаты в списке2. Они имеют разную длину, и все в порядке, если я не использую все точки списка2 или даже если я повторно использую точки, если я просматриваю все точки только один раз в списке1. Мне нужен сам сдвиг, а также расположение в списках обеих точек. Вот что я сделал, чтобы найти сдвиг:Как найти ближайшую (x, y) позицию к (x, y) в другом списке?

s_x = ([1.0,2.0,3.0]) 
s_y = ([1.5,2.5,3.5]) 
SDSS_x = ([3.0,4.0,5.0]) 
SDSS_y = ([3.5,4.5,5.5]) 

list1 = zip(s_x,s_y) 
list2 = zip(SDSS_x,SDSS_y) 

shift = [] 
place_in_array = [] 

for num,val in enumerate(list1): 
    guess = 9999999999999.0 
    place_guess = 0 
    for index,line in enumerate(list2): 
     new_guess = math.hypot(line[0] - val[0], line[1] - val[1]) 
     if new_guess < guess: 
      guess = new_guess 
      place_guess = index 
    shift.append(guess) 
    place_in_array.append(place_guess) 

print shift 
print place_in_array 

но вывод таков:

[2.8284271247461903, 1.4142135623730951, 0.0] 
[0, 0, 0] 

Это неправильно, и я не могу понять, в чем проблема.

+0

Выход у вас есть правильно, по крайней мере, согласно моей интерпретации желаемого результата. 1-й пункт в 'list2', (3.0.3.5) является ближайшей точкой для всех трех точек в «list1», поэтому «place_in_array» - это показатель нулевого индекса, 1-й пункт в «list2», а соответствующие расстояния от каждой точки в «list1» - это значения в ' shift'. –

ответ

3

Есть specialized data structures for these geometric queries, с реализацией, которые отлаживаются и эффективны. Почему бы не использовать их? sklearn.neighbors.BallTree могут выполнять эти типы запросов, а также sklearn.neighbors.KDTree.

+0

из того, что я могу сказать (хотя я не эксперт), эти функции не сравнивают два массива, нет места для ввода второго массива, только чтобы найти «ближайших соседей» к точке в этом массиве, что бы это ни значило. – Wilsonwatson

+0

возможно, вы можете объяснить n Мне, как я буду использовать их, если это возможно, потому что я знаю, что они будут работать быстрее, и я пытаюсь использовать это для большого количества данных – Wilsonwatson

2
def lazy_dist(p0): 
    return lambda p1:(p0[0] -p1[0])**2 + (p0[1] - p1[1])**2 
closest_matches = {p0:min(list2,key=lazy_dist(p0)) for p0 in list1} 

Я думаю, что будет делать то, что вы хотите (не очень быстро, но он должен работать

Смежные вопросы