【问题标题】:How do I find the coordinates of the two closest points to my point in a list如何在列表中找到离我的点最近的两个点的坐标
【发布时间】:2022-01-14 12:14:11
【问题描述】:

我有一个值列表和一个给定点,我想找到两个最近点的坐标(一个下级和一个上级)。

例如:

list = [0, 0.5, 1, 1.5, 2, 2.5, 3]
point = 0.7

我希望我的返回值为 [1, 2],因为 0.7 介于 0.5 和 1 之间。

知道怎么做吗?

【问题讨论】:

  • 返回值不应该是 [0.5, 1] 吗?我错过了什么吗?
  • @Kinille 我想要坐标,但如果我有值也可以得到它们
  • 哦,你的意思是你想要最近坐标的索引。
  • @Kinille 正是(对不起,如果我不是很清楚)
  • 假设列表为[ 1,1, 1, 1, ..., 1 ],点为1,应该返回什么?

标签: python geometry coordinates


【解决方案1】:

假设给定列表始终按照您的示例排序,并且它肯定有一个值低于您的给定点,一个值高于您的给定点,那么您可以遍历列表,直到找到一个大于给定点的值然后返回一个包含该索引及其下方索引的列表。

def two_closest(_list, point):
    for index, value in enumerate(_list):
        if value > point:
            return (index-1, index)
    raise Exception("Malformed parameters")

对于较大的列表,您可以使用二分搜索或其他启发式方法来加快速度。例如,您说您的列表是由 np.linespace 创建的,如果您知道列表是如何创建的,您可以找到您的坐标所在的确切位置。

【讨论】:

    【解决方案2】:

    你可以计算距离然后利用numpy.argsort:

    import numpy as np
    
    def closest_n_indexes(distances, n=2):
        return np.argsort(distances)[:n]
    
    point_list = [0, 0.5, 1, 1.5, 2, 2.5, 3]
    point = 0.7
    
    distances = [abs(p-point) for p in point_list]
    
    closest_n_indexes(distances)
    Out[8]: array([1, 2])
    

    【讨论】:

    • 太完美了!谢谢!
    【解决方案3】:

    如果list 已排序,您可以使用python 的内置二进制搜索库。速度非常快:

    import bisect
    
    def get_bracket(lst, target):
        lindex = bisect.bisect_right(lst, target) - 1
        rindex = lindex + 1
        return [lindex, rindex]
    
    print(get_bracket([0, 0.5, 1, 1.5, 2, 2.5, 3], 0.7))
    

    哪个打印:

    [1, 2]
    

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2019-04-30
      • 2012-09-12
      相关资源
      最近更新 更多