在Python中使用欧几里得距离确定最近的位置

Posted

技术标签:

【中文标题】在Python中使用欧几里得距离确定最近的位置【英文标题】:Determine closest location using euclidian distance in Python 【发布时间】:2022-01-02 04:05:01 【问题描述】:

所以我正在努力从字典中的数据中找到两个坐标的最近欧几里得距离。 首先,我想出了如何使用以下方法计算两个笛卡尔坐标 (x,y) 之间的距离:

from math import sqrt
def distance(loc1_coordinates, loc2_coordinates):
    point1x, point1y = loc1_coordinates
    point2x, point2y = loc2_coordinates
    Distance = sqrt((point1x-point2x)**2 + (point1y-point2y)**2)  
    return "The distance between this two points is", str(round(Distance, 14))+" units"

print(distance([0,0],[3,4])) # distance should be 5.0

如何根据我之前的函数创建一个新函数,以便得到以下结果?

cities = 'A':[5,21], 'B':[43,76], 'C':[56,19], 'D':[21,37], 'E':[76,23], 'F':[45,56], 'G':[23,13]
print(closest_destination('A', cities)) # should be 'G'

更新:我正在尝试在输入城市的计算列表中找到最小距离:例如:比较 A->B、A->C、A->D、...并选择具有最近的距离

【问题讨论】:

提示:所以您正试图在A->BA->CA->D、...的计算列表中找到最小距离? @Woodford 是的!我正在尝试将 A 与每个城市进行比较,并选择与 A 距离最近的城市 那就这样吧。然后告诉我们你尝试了什么以及哪里出了问题。 【参考方案1】:

首先,将您的函数更改为返回数值而不是字符串(通常,您应该有函数返回值,让您可以在代码中使用它们做其他有用的事情,而不是将它们转换为英语表示) :

from math import sqrt
def distance(loc1_coordinates, loc2_coordinates):
    point1x, point1y = loc1_coordinates
    point2x, point2y = loc2_coordinates
    return sqrt((point1x-point2x)**2 + (point1y-point2y)**2)  

您可以使用此函数做的一件有用的事情是在min 函数中将其用作key 以找到最小距离:

def closest_destination(city: str, cities: dict) -> str:
    """Given a city in a city: coord dict, return closest other city."""
    other_cities = k: v for k, v in cities.items() if k != city
    return min(other_cities, key=lambda o: distance(cities[o], cities[city]))

然后:

cities = 'A':[5,21], 'B':[43,76], 'C':[56,19], 'D':[21,37], 'E':[76,23], 'F':[45,56], 'G':[23,13]
print(closest_destination('A', cities)) # prints 'G'

【讨论】:

【参考方案2】:

单通方法是使用min的关键参数:

def closest_destination(source, locations):
    source_location = locations[source]
    return min(locations, key=lambda loc: (loc == source, distance(source_location, locations[loc])))


cities = 'A': [5, 21], 'B': [43, 76], 'C': [56, 19], 'D': [21, 37], 'E': [76, 23], 'F': [45, 56], 'G': [23, 13]
print(closest_destination('A', cities))  # should be 'G'

输出

G

函数的思路:

lambda loc: (loc == source, distance(source_location, locations[loc]))

将每个 city 键映射到一个元组,如果它等于源,则第一个值为 1,因此它将始终排在最后。然后你按距离打破关系。

【讨论】:

以上是关于在Python中使用欧几里得距离确定最近的位置的主要内容,如果未能解决你的问题,请参考以下文章

矢量量化中的马氏距离与欧几里得距离

在 Python 中使用随机点制作欧几里德距离矩阵

欧几里得距离

计算欧几里得距离的python方法的精度有啥不同吗?

在Python中获取两个向量的欧几里得距离[重复]

在Python中获取X和Y的欧几里得距离[重复]