我有一个像[[5,0],[6,8],[0,30]] 坐标列表,我想创建一个距离列表这些坐标之间的相关性如[0,0]我怎样才能得到一个Python中的计算列表
如何以简单的方式获得列表[5,10,30]? (欧氏距离)
我有一个像[[5,0],[6,8],[0,30]] 坐标列表,我想创建一个距离列表这些坐标之间的相关性如[0,0]我怎样才能得到一个Python中的计算列表
如何以简单的方式获得列表[5,10,30]? (欧氏距离)
只需使用一个简单的列表理解:
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中的定义。
最好的,如果所需的参考点确实是[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编写所有东西时,正在执行几个这样的“翻译”。
是的,我用timeit检查过,math.hypot更加优化和快速,你能更多地关注它如何更快速和优化 – Hackaholic
@Hackaholic,完成! –
试试这个:
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]
不值得承担'abs' - 纯粹的开销,因为在任何数字'n'上平方都可以像在abs(n)'上一样工作 - - ) –
使用地图功能将是不错的主意。
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]
您可以根据您的参考点编辑距离函数。
是_6^2 + 8^2 = 10^2 triangel规则? –
是的,它的欧几里得距离 –