繁体   English   中英

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

[英]efficient way to map values between two lists in python

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

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

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

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

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

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

尝试舍入第二个列表中的坐标。 如果有坐标,那会给你很多小簇。 将四舍五入的坐标用作字典中的键,将坐标+值列表作为值。

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

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

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

您可以创建空间地图,将“区域”映射到该区域中第二个列表中的点,例如,可以将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) (24, 13)对应的列表。 当然,这些区域的大小可以根据点的分布而不同。

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

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM