簡體   English   中英

點列表的成對歐幾里得距離

[英]Pairwise Euclidean distance from a list of points

我正在嘗試編寫一個Python函數(不使用模塊),該函數將遍歷坐標列表並查找兩個后續點之間的歐式距離(例如,點a和b,b和c,c之間的距離)和d等)。 經過幾個小時的搜索,我發現這篇文章認為可以解決我的問題,所以我寫了這樣的文章:

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。

使用列表理解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:]))

或者,對於使用map Python 3(來自注釋):

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

一種方法是:

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)

基本上,記錄第一項,然后從列表中的第二項進行迭代。 最好將pOnepTwo交換pOne更好地理解,或者更清楚並使用更多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)

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM