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

finding closest x,y position in one list to an x,y position in another?

所以我有两个带有 x 和 y 坐标的二维列表,我想遍历 list1,并为每个点在 list2 中找到最接近的 x、y 坐标。它们的长度不同,如果我不使用 list2 的所有点或者即使我重复使用点也没关系,只要我在 list1 中只遍历所有点一次。我需要转移本身以及两个点列表中的位置。我尝试使用在此站点上找到的功能,但它似乎不起作用:

def do_kdtree(combined_x_y_arrays,points):
    mytree = scipy.spatial.cKDTree(combined_x_y_arrays)
    dist, indexes = mytree.query(points)
    return dist,indexes

#Perhaps it's not doing what I wanted it to do. Here is what I tried:

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 = do_kdtree(list1,list2)

我得到的错误:

Traceback (most recent call last):
  File "tester.py", line 23, in <module>
    shift,place_in_array = do_kdtree(list1,list2)
  File "tester.py", line 9, in do_kdtree
    mytree = scipy.spatial.cKDTree(combined_x_y_arrays)
  File "ckdtree.pyx", line 811, in scipy.spatial.ckdtree.cKDTree.__init__ (scipy/spatial/ckdtree.c:7157)
ValueError: too many values to unpack (expected 2)

我的印象是这意味着该函数不需要二维列表,这意味着该函数并没有真正按照我的意愿进行。我什至不确定 "indexes" 返回了什么,以及它是否真的是列表中的重点,这正是我所希望的。如果是这样的话,有人可以告诉我是否有我可以用来执行此操作的现有功能吗?

您错误地使用了 zip,因为它不会为您创建二维列表:

 >>> s_x = ([1.0,2.0,3.0])
 >>> s_y = ([1.5,2.5,3.5])

 >>> list1_broken = zip([s_x],[s_y])
 >>> print list1_broken
 [([1.0, 2.0, 3.0], [1.5, 2.5, 3.5])]

 >>> list1 = zip(s_x,s_y)
 >>> print list1
 [(1.0, 1.5), (2.0, 2.5), (3.0, 3.5)]