2017-02-21 34 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

你需要做一些元组拆包 - 例如对于Python <3.5,'Distance(* array [0],* array [1])',for> = 3.5 – asongtoruin

+0

例如,如果我的输入是array = [[array] [array] (5,2),( - 1,3),(6,-6)],我想得到输出[(5,2),(-1,3)] = 6.082,[(-1,3) ,(6,-6)] = 11.401 – Daniel

回答

1

这将返回一个包含输入为元组(X,Y)每两个连续点之间的(欧几里得)距离的列表。这些代码片段假设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