2017-04-24 157 views
2

我編寫了這段代碼來計算距離。但得到ValueError: math domain error的錯誤。計算多維矩陣中的距離

import math 

a=[[5, 10], 
    [16, 23]] 

b=[[6, 1], [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d=math.sqrt((a[i][k]-b[j][k])^2 + (a[i][h]-b[j][h])^2) 
     dL.append(d) 
    dist.append(dL) 

在迭代,d應該是:

i=0, j=0: d=sqrt((5-6)^2+(10-1)^2) 
i=0, j=1: d=sqrt((5-21)^2+(10-2)^2) 
i=1, j=0: d=sqrt((16-6)^2+(23-1)^2) 
i=1, j=1: d=sqrt((16-21)^2+(23-2)^2) 
+3

'^2'不是正方形,它是異或。 – ForceBru

+3

使用'x ** y'將'x'提升到'y'的力量。 – blacksite

+0

當我計算d時,如何在同一行中將d四捨五入到小數點後4位 – user02

回答

0

len(a)值是2,而對於數自0,所以,要求數組中的第三個元素,你必須做
for i in range(len(a) - 1):

+0

'range(len(a))'只會產生從'0'到'len(a)-1'的值,所以你建議的不正確。 – martineau

0

sqrt在您嘗試使用負數時會出現該錯誤。 sqrt(-16)給出了該錯誤,因爲結果是一個複數。

from math import sqrt 
a=[[5, 10], [16, 23]] 


b=[[6, 1], [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     temp1 = (a[i][k]-b[j][k]) ** 2 
     temp2 = (a[i][h]-b[j][h]) ** 2 
     temp = temp1 + temp2 
     if temp > 0: 
      d = sqrt(temp) 

     dL.append(d) 
    dist.append(dL) 
+0

你的答案沒有解決的問題在於OP使用'^'而不是'**',這在註釋中已經解釋過了。 –

+0

是的,我同意,但如果我們使用sqrt作爲複數中的負數返回,則squareroot函數還有另一個問題@ThierryLathuille – user229204

+0

正方形是正數。 –

0

在他們的評論中提及@not_a_robot,在Python冪運算符是**^,因爲它是在(許多)其他編程語言。你可以通過簡單的替換來解決你的問題。

import math 

a= [[ 5, 10], 
    [16, 23]] 
b= [[ 6, 1], 
    [21, 2]] 

dL=[] 
dist=[] 
k=0 
h=1 
for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d = math.sqrt((a[i][k]-b[j][k])**2 + (a[i][h]-b[j][h])**2) 
     dL.append(d) 
    dist.append(dL) 

正如我在評論中提到,這將是更好地使用math.hypot()這個,因爲它會更快地得到相同的結果,並更容易閱讀(寫):

for i in range(len(a)): 
    dL=[] 
    for j in range(len(a)): 
     d = math.hypot(a[i][k]-b[j][k], a[i][h]-b[j][h]) 
     dL.append(d) 
    dist.append(dL)