2015-01-03 117 views
-2

我有一个像[[5,0],[6,8],[0,30]] 坐标列表,我想创建一个距离列表这些坐标之间的相关性如[0,0]我怎样才能得到一个Python中的计算列表

如何以简单的方式获得列表[5,10,30]? (欧氏距离)

+0

是_6^2 + 8^2 = 10^2 triangel规则? –

+0

是的,它的欧几里得距离 –

回答

0

只需使用一个简单的列表理解:

from math import sqrt 
list = [[5,0],[6,8],[0,30]] 
list2 = [sqrt(k[0]**2 + k[1]**2) for k in list] 
print(list2) 

如果你想从一个点不是(0,0)的距离,只是改变了公式中list2中的定义。

3

最好的,如果所需的参考点确实是[0,0]:

>>> input_list = [[5, 0], [6, 8], [0, 30]] 
>>> import math 
>>> desired_list = [math.hypot(*x) for x in input_list] 
>>> print(desired_list) 

对于一个更通用的点,它是一点点更多的工作:

>>> c = [1, 1] 
>>> other_list = [math.hypot(x[0]-c[0],x[1]-c[1]) for x in input_list] 
>>> print(other_list) 
[4.123105625617661, 8.602325267042627, 29.017236257093817] 

...但不太糟糕了:-)。

的核心点:“重新发明毕达哥拉斯轮”做你自己的平方和开方:math.hypot这是否代表您在更优化,更可读的方式。你给它的“导管”(一个直角三角形的两个短边),它会让你恢复小假使用(同一个直角三角形的最长边)。

补充:为什么math.hypot会更快,我问?简单!因为它在C编码内部进行了平方,加法和平方根“内部”,只有一个从输入PyObject*到C double的“转换”,并且只有一个返回到PyObject*的结果。当用Python编写所有东西时,正在执行几个这样的“翻译”。

+0

是的,我用timeit检查过,math.hypot更加优化和快速,你能更多地关注它如何更快速和优化 – Hackaholic

+0

@Hackaholic,完成! –

0

试试这个:

import math 
>>> def distance(my_list,cor): 
...  return [math.sqrt(abs(x[0]-cor[0])**2 + abs(x[1]+cor[1])**2) for x in my_list] 
... 
>>> distance([[5, 0], [6, 8], [0, 30]],[0,0]) 
[5.0, 10.0, 30.0] 
+1

不值得承担'abs' - 纯粹的开销,因为在任何数字'n'上平方都可以像在abs(n)'上一样工作 - - ) –

1

使用地图功能将是不错的主意。

def distance(coord): 
    return ((coord[0]**2) + (coord[-1]**2))**0.5 
a = [[5,0],[6,8],[0,30]] 
b = map(distance,a) #b = [5.0,10.0,30.0] 

您可以根据您的参考点编辑距离函数。

相关问题