2017-02-21 23 views
0

Как я могу улучшить следующую формулу, которая работает для списка массива. Я не хочу вводить x и y вручную, и я хочу знать, что это расстояние связано с точкамиКак напечатать точки в виде массива?

Например: dis: (2,4) & (-4,2) = ?? dis: (-4,2) & (10,-5) = ??

import math 
array = [(2, 4), (-4, 2),(10, -5)] 


def Distance(x1, y1, x2, y2): 

    dist= math.sqrt((x2-x1)**2 +(y2-y1)**2) 
    return dist 

Distance(array) 
+0

Что именно вы хотите? Вы хотите передать список кортежей и получить расстояние между ними? Как это будет работать? Или просто пройти ровно 2 пары? – ospahiu

+1

вам нужно будет сделать некоторую распаковку кортежа - например. 'Distance (* array [0] + array [1])' для Python <3.5, 'Distance (* array [0], * array [1])' for> = 3.5 – asongtoruin

+0

Например, если мой вход Is array = [ (5, 2), (- 1, 3), (6, -6)], я хочу получить выход [(5, 2), (-1, 3)] = 6.082, [(-1,3) , (6, -6)] = 11,401 – Daniel

ответ

1

Это будет возвращать список, содержащий (евклидово) расстояние между каждыми двумя последовательными точками, введенных в качестве наборов (х, у). Эти фрагменты кода предполагают Python 3.x, поэтому небольшие изменения могут потребоваться, если вы используете Python 2.7. Тэги не совсем понятны.

import math 


def distances(lst): 
    ln = len(lst) 
    dists = [] 
    if ln >= 2: # if array contains no or only 1 tuple, return [] 
     for index, tup in enumerate(lst[:ln - 1]): 
      x1, y1 = tup 
      x2, y2 = lst[index + 1] # gets x and y of next tuple in the array 
      dists.append(math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)) 
    return dists 


array0 = [] 
array1 = [(2, 4), (-4, 2)] 
array2 = [(5, 2), (-1, 3), (6, -6)] 
array3 = [(2, 4), (-4, 2), (10, -5), (9, -2)] 

print(distances(array0)) 
print(distances(array1)) 
print(distances(array2)) 
print(distances(array3)) 

Выход:

[] 
[6.324555320336759] 
[6.082762530298219, 11.40175425099138] 
[6.324555320336759, 15.652475842498529, 3.1622776601683795] 

Если вы хотите напечатать расстояния, как вы упомянули:

import math 


def distances(lst): 
    ln = len(lst) 
    if ln >= 2: 
     for index, tup in enumerate(lst[:ln - 1]): 
      x1, y1 = tup 
      x2, y2 = lst[index + 1] 
      dist = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) 
      print(lst[index:index + 2], "=", dist) 


array = [(5, 2), (-1, 3), (6, -6)] 

distances(array) 

Выход:

[(5, 2), (-1, 3)] = 6.082762530298219 
[(-1, 3), (6, -6)] = 11.40175425099138 

Той же функциональность, как и прежде банки быть достигнуто с помощью модуля numpy instea d математики:

import numpy as np 


def distances(lst): 
    ln = len(lst) 
    dists = [] 
    if ln >= 2: 
     for index, tup in enumerate(lst[:ln - 1]): 
      dists.append(np.linalg.norm(lst[index + 1] - tup)) 
    return dists 


array0 = np.array([]) 
array1 = np.array([(2, 4), (-4, 2)]) 
array2 = np.array([(5, 2), (-1, 3), (6, -6)]) 
array3 = np.array([(2, 4), (-4, 2), (10, -5), (9, -2)]) 

print(distances(array0)) 
print(distances(array1)) 
print(distances(array2)) 
print(distances(array3)) 

Выход:

[] 
[6.324555320336759] 
[6.0827625302982193, 11.401754250991379] 
[6.324555320336759, 15.652475842498529, 3.1622776601683795] 

Если вы хотите только расстояние между двумя кортежей содержится в списке:

import math 


def distance(lst): 
    return math.sqrt((lst[1][0] - lst[0][0]) ** 2 + (lst[1][1] - lst[ 
     0][1]) ** 2) 


array = [(2, 4), (-4, 2)] 

print(distance(array)) 

Выход:

6.324555320336759 
0

Предполагая, что вы используете Python 2.7, так как неясно :

import math 


def Distance(x1, y1, x2, y2): 
    return math.sqrt((x2-x1)**2 +(y2-y1)**2) 

points = [(5, 2), (-1, 3), (6, -6)] 

pairs = [(points[i], points[i+1]) for i in range(len(points)-1)] 

for val in pairs: 
    print 'Distance between {0} and {1}: {2}'.format(val[0], val[1], Distance(*val[0]+val[1])) 

Мы используем список понимание отработать каждую пару точек (предполагая, что вы хотите только последовательных значения в списке для каждой пары), а затем использовать кортеж распаковку кормить их в качестве входных данных для метода Distance.

Если вы в Python 3.x, эта последняя строка должна быть:

print('Distance between {0} and {1}: {2}'.format(val[0], val[1], Distance(*val[0], *val[1]))) 

С вашей данном примере, это печатает:

Distance between (5, 2) and (-1, 3): 6.0827625303 
Distance between (-1, 3) and (6, -6): 11.401754251 

 Смежные вопросы

  • Нет связанных вопросов^_^