2015-01-03 119 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] 

您可以根據您的參考點編輯距離函數。

相關問題