来自点列表的成对欧几里得距离
Pairwise Euclidean distance from a list of points
我正在尝试编写一个 Python 函数(不使用模块),它将遍历坐标列表并找到两个后续点之间的欧氏距离(例如,点之间的距离a 和 b、b 和 c、c 和 d 等)。经过几个小时的搜索,我遇到了 this post,我认为它解决了我的问题,所以我写了这个:
myList = [[2, 3], [3,4], [4,5], [5,6], [6,7]]
def distance(pointOne,pointTwo):
eucDist = ((pointOne[0] - pointTwo[0])**2 + (pointOne[1] - pointTwo[1])**2)**0.5
return eucDist
def totalDistance(inputPoints):
dist = []
for item in inputPoints[1:]:
coordDist = distance(inputPoints[0],item)
dist.append(coordDist)
return sum(dist)
print totalDistance(myList)
但是,这会检索第一个点与其他所有点之间的距离。我一直在试图弄清楚如何为序列中的下一点定义变量,但我对 Python 还很陌生,只是不太了解如何到达那里。我目前正在这样编写 totalDistance
函数:
def totalDistance(inputPoints):
dist = []
for item in inputPoints:
pOne = item
pTwo =
coordDist = distance(pOne,pTwo)
dist.append(coordDist)
return sum(dist)
但不知道如何定义 pTwo。
一种方法是:
def totalDistance(inputPoints):
dist = []
pTwo = inputPoints[0]
for item in inputPoints[1:]:
pOne = pTwo
pTwo = item
coordDist = distance(pOne,pTwo)
dist.append(coordDist)
return sum(dist)
基本上是记录第一项,从列表的第二项开始迭代。最好交换 pOne
和 pTwo
以便更容易理解,或者更清楚并使用更多 Pythonic 名称:
def totalDistance(input_points):
dist = []
this_item = input_points[0]
for item in input_points[1:]:
prev_item = this_item
this_item = item
coord_dist = distance(prev_item, this_item)
dist.append(coord_dist)
return sum(dist)
使用 list comprehension and zip 可以这样做:
代码:
def distance(point_one, point_two):
return ((point_one[0] - point_two[0]) ** 2 +
(point_one[1] - point_two[1]) ** 2) ** 0.5
def total_distance(points):
return sum(distance(p1, p2) for p1, p2 in zip(points, points[1:]))
或者 Python 3(来自评论)使用 map
:
def total_distance(points):
return sum(map(distance, points, points[1:]))
测试代码
my_points = [[2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
print(total_distance(my_points))
结果:
5.656854249492381
使用 itertools 和 NumPy:
from itertools import tee
import numpy as np
def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def total_dist(points):
return np.sum(np.sqrt(np.sum(np.square(
np.diff(tuple(pairwise(points)))), axis=-2)))
total_dist(myList)
# 5.656854249492381
我正在尝试编写一个 Python 函数(不使用模块),它将遍历坐标列表并找到两个后续点之间的欧氏距离(例如,点之间的距离a 和 b、b 和 c、c 和 d 等)。经过几个小时的搜索,我遇到了 this post,我认为它解决了我的问题,所以我写了这个:
myList = [[2, 3], [3,4], [4,5], [5,6], [6,7]]
def distance(pointOne,pointTwo):
eucDist = ((pointOne[0] - pointTwo[0])**2 + (pointOne[1] - pointTwo[1])**2)**0.5
return eucDist
def totalDistance(inputPoints):
dist = []
for item in inputPoints[1:]:
coordDist = distance(inputPoints[0],item)
dist.append(coordDist)
return sum(dist)
print totalDistance(myList)
但是,这会检索第一个点与其他所有点之间的距离。我一直在试图弄清楚如何为序列中的下一点定义变量,但我对 Python 还很陌生,只是不太了解如何到达那里。我目前正在这样编写 totalDistance
函数:
def totalDistance(inputPoints):
dist = []
for item in inputPoints:
pOne = item
pTwo =
coordDist = distance(pOne,pTwo)
dist.append(coordDist)
return sum(dist)
但不知道如何定义 pTwo。
一种方法是:
def totalDistance(inputPoints):
dist = []
pTwo = inputPoints[0]
for item in inputPoints[1:]:
pOne = pTwo
pTwo = item
coordDist = distance(pOne,pTwo)
dist.append(coordDist)
return sum(dist)
基本上是记录第一项,从列表的第二项开始迭代。最好交换 pOne
和 pTwo
以便更容易理解,或者更清楚并使用更多 Pythonic 名称:
def totalDistance(input_points):
dist = []
this_item = input_points[0]
for item in input_points[1:]:
prev_item = this_item
this_item = item
coord_dist = distance(prev_item, this_item)
dist.append(coord_dist)
return sum(dist)
使用 list comprehension and zip 可以这样做:
代码:
def distance(point_one, point_two):
return ((point_one[0] - point_two[0]) ** 2 +
(point_one[1] - point_two[1]) ** 2) ** 0.5
def total_distance(points):
return sum(distance(p1, p2) for p1, p2 in zip(points, points[1:]))
或者 Python 3(来自评论)使用 map
:
def total_distance(points):
return sum(map(distance, points, points[1:]))
测试代码
my_points = [[2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
print(total_distance(my_points))
结果:
5.656854249492381
使用 itertools 和 NumPy:
from itertools import tee
import numpy as np
def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return zip(a, b)
def total_dist(points):
return np.sum(np.sqrt(np.sum(np.square(
np.diff(tuple(pairwise(points)))), axis=-2)))
total_dist(myList)
# 5.656854249492381