如何改进适用于数组列表的以下公式。我不想手动输入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 :(得分: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模块而不是math:
可以实现与以前相同的功能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
答案 1 :(得分: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
方法的输入。< / p>
如果你在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