【问题标题】:Find Index That Matches To Closest Provided Number Pairing查找与提供的最接近的数字配对匹配的索引
【发布时间】:2020-02-23 03:53:01
【问题描述】:

我在 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 将返回相应的索引号,这将是上面提供的列表 sn-p 中的第三组值。

使用this example,我已经能够按单个列表对该搜索进行分区并返回相应的索引号。但是,索引号是不同的。

代码:

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

有没有有效的方法来解决这个问题?

【问题讨论】:

  • 你的与上面的索引不同是什么意思? lats 在您的输入中包含相同的值
  • 您需要定义matches the closestboth lat 和lon。也许类似于差异绝对值的总和。您不能单独查看它们。

标签: python arrays list indexing min


【解决方案1】:

您可以先使用sqrt((x[0] - y[0]) ** 2 + (x[1] - y[1]) ** 2) 找到两点之间的euclidean distance,然后将其与min() 结合使用作为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

注意:您可以在元组列表中以latslons 开头,然后您无需在函数中调用zip()

【讨论】:

    【解决方案2】:

    为什么不为纬度和经度制作一个对象。

    class LatLong:
    
          def __init__(self, lat, lon):
              self.lat = lat
              self.lon = lon
    

    然后创建一个对象列表,对于给定的经纬度,只需循环遍历对象列表并返回对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2015-01-23
      • 2012-10-01
      • 2019-12-14
      • 1970-01-01
      • 2019-11-02
      相关资源
      最近更新 更多