我有两个带有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]
这些都是错的,我无法弄清问题是什么。
答案 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}
我认为会做你想做的事(不是很快但是应该有效)