Estoy tratando de escribir una función de Python (sin el uso de módulos) que recorra una lista de coordenadas y encuentre la distancia euclidiana entre dos puntos posteriores (por ejemplo, la distancia entre los puntos a y b, b y c, c yd, etc.). Después de unas horas de búsqueda me encontré con esta publicación que pensé resolvió mi problema, así que escribí esto:

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)

Sin embargo, esto recupera la distancia entre el primer punto y cualquier otro punto. He estado tratando de descubrir cómo definir una variable para el siguiente punto de la secuencia, pero soy bastante nuevo en Python y no entiendo cómo llegar allí. Actualmente estoy escribiendo la función totalDistance de esta manera:

def totalDistance(inputPoints):
    dist = []
    for item in inputPoints:
        pOne = item
        pTwo = 
        coordDist = distance(pOne,pTwo)
        dist.append(coordDist)
    return sum(dist)

Pero no puedo entender cómo haría para definir pTwo.

2
asn_pdx 26 feb. 2018 a las 03:48

3 respuestas

La mejor respuesta

Una forma de hacerlo sería:

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)

Básicamente, registre el primer elemento e itere desde el segundo elemento de la lista. Probablemente sea mejor intercambiar pOne y pTwo para una mejor comprensión, o para ser más claro y usar más nombres pitónicos:

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)
0
Ken Y-N 26 feb. 2018 a las 00:52

Con una comprensión de la lista y zip esto se puede hacer así:

Código:

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:]))

O, alternativamente, para Python 3 (de los comentarios) utilizando map :

def total_distance(points):
    return sum(map(distance, points, points[1:]))

Código de prueba

my_points = [[2, 3], [3, 4], [4, 5], [5, 6], [6, 7]]
print(total_distance(my_points))

Resultados:

5.656854249492381
3
Stephen Rauch 26 feb. 2018 a las 02:03

Con itertools y 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
0
Brad Solomon 26 feb. 2018 a las 01:25