我有一個像[[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規則? –
是的,它的歐幾里得距離 –