如何在另一个列表中找到最接近(x,y)位置到(x,y)的位置?

时间:2015-07-02 16:48:07

标签: python python-2.7

我有两个带有x和y坐标的2D列表,我想要浏览list1,并且对于每个点找到list2中最接近的(x,y)坐标。它们的长度不同,如果我不使用list2的所有点,或者即使我重用了点,也没关系,只要我在list1中只检查一次所有点。我需要移位本身以及两个点列表中的位置。以下是我为找到转变所做的工作:

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]

这些都是错的,我无法弄清问题是什么。

2 个答案:

答案 0 :(得分:3)

specialized data structures for these geometric queries,其实现经过调试和高效。为什么不使用它们? sklearn.neighbors.BallTree可以执行这些类型的查询,以及sklearn.neighbors.KDTree

答案 1 :(得分: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}

我认为会做你想做的事(不是很快但是应该有效)