在python中映射两个列表之间的值的有效方法

时间:2013-10-09 08:23:22

标签: python

我有两个清单。第一个列表是坐标对列表

[[x1, y1]
 [x2, y2]
 ...
 [xn, yn]]

第二个列表是坐标对列表以及与每对相关联的值

[[x1',y1',v1']
 [x2',y2',v2']
 ...
 [xn',yn',vn']]

我想在第一个列表中的每对(x,y)的第二个列表中找到最接近的(x',y'),然后映射值v'到(x,y)。

我目前的解决方案是遍历两个列表并计算每个可能的坐标对之间的欧氏距离并映射到最小距离。但原来的第二个清单有300万个条目!有没有更有效的方法来实现这一目标?感谢。

2 个答案:

答案 0 :(得分:1)

尝试对第二个列表中的坐标进行舍入。如果坐标,这会给你很多小簇。使用圆角坐标作为dict中的键,坐标列表+值作为值。

for x,y in first_list:
    x_,y_ = round(x,y)
    l = d[(x_,y_)]
    ... find closest point in l...

使用此算法,您只需要检查几个点。

如果列表为空,则可以使用更松散的舍入重试。

答案 1 :(得分:1)

您可以创建一个空间地图,将“区域”映射到此区域中第二个列表中的点,例如,您可以映射x-min,x-max,y-min,y-max的4元组点,像这样:

{(0, 10, 0, 10): [(2, 4, 5), (5, 1, 12), ...], (0, 10, 10, 20): [(4, 14, -1), ...] }

现在,您可以从第一个列表中为您的点选择相应的区域,例如,如果该点为(24, 13),请选择与区域(20, 30, 10, 20)对应的列表。当然,这些区域的大小可能会有所不同,具体取决于点的分布。

如果此区域有任何点,请选择与原点距离最小的点;否则看看该区域周围八个区域的下一个“层”,依此类推。一旦找到了一个点,就应该再扩展一个层,因为这些层中仍然可能有一个点靠近原点。 (见图)

enter image description here

这里,红点是第一个列表中的点,蓝点是第二个列表中的点。这些框对应于地图中的区域。尽管区域中有两个点直接对应于原始点,但下一个“层”中的点更接近,但您不必进一步搜索。