python - 查找与提供的最接近的数字配对匹配的索引
问题描述
我在 Python 中有三个单独的列表,它们都非常大。一个规定是列表不能从它们当前的显示方式重新排序。每个列表的外观片段如下:
lats = [40.92322342,40.92322342,40.92322342,40.92322342,40.92322342]
lons = [-74.32176109,-74.29518277,-74.26860445,-74.24202613,-74.21544781]
data = [19,19,19,17,18]
我希望提供纬度和经度配对,并希望返回与data
提供的纬度和经度最接近的列表的索引号和相应值。
例如,配对40.9254, -74.2765
将返回相应的索引号,这将是上面提供的列表片段中的第三组值。
使用此示例,我已经能够按单个列表对搜索进行分区并返回相应的索引号。但是,索引号是不同的。
代码:
min(enumerate(lats), key=lambda x: abs(x[1]-40.9254))
min(enumerate(lons), key=lambda x: abs(x[1]-(-74.2765)))
an index #, 40.92322342
a different index # than above, -74.26860445
有没有什么有效的方法可以解决这个问题?
解决方案
您可以先使用 找到两点之间的欧几里德距离sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2)
,然后将其与min()
as结合使用key
以找到最近点。
from math import sqrt
lats = [40.92322342,40.92322342,40.92322342,40.92322342,40.92322342]
lons = [-74.32176109,-74.29518277,-74.26860445,-74.24202613,-74.21544781]
def euclidean_distance(x, y):
return sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2)
def find_closest_point(data, point):
# create (point, index) pairs
indices = ((e, i) for i, e in enumerate(data))
# find smallest point, and only return the index
return min(indices, key=lambda p: euclidean_distance(p[0], point))[1]
print(find_closest_point(zip(lats, lons), (40.9254, -74.2765)))
返回第三对坐标(索引从 0 开始):
2
注意:你可以在一个元组列表中开始,lats
然后lons
你不需要调用zip()
函数。
推荐阅读
- python - 如何在不使用 django 表单的情况下存储图像
- php - 编码文件的格式主要 ID 为 65540,而优化器预计为 2
- python - 如何将按钮彼此相邻放置?
- bash - 具有多个管道的 Bash 命令提供随机输出
- grafana - 如何使流利的从最后一个动态创建的文件夹向 Loki 发送日志
- python - 带有不平衡标签的多标签分类
- python - Django Migrate 使用特定的数据库和模型
- sql - 选择在两个不同表上连接的具有两个不同条件的列
- python - SQLAlchemy 如何使用 ORM 重新创建此更新语句
- angular - Angular:为我的库使用全局样式 css:正确的方法?