2017-04-24 21 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'は正方形ではなく、XORです。 – ForceBru

+3

'x ** y'を使って' x'を 'y'番目の力に上げます。 – blacksite

+0

dを計算すると同じ行のdを4桁に丸める方法 – user02

答えて

0

len(a)の値が2で、0からカウントに、そう、あなたがしなければならない、配列の3番目の要素を求める
for i in range(len(a) - 1):

+0

'range(len(a))'は '0'から' len(a)-1'までの値しか生成しないので、あなたが示唆しているのは間違っています。 – martineau

0

sqrtは、負の数で使用しようとするとエラーが発生します。結果が複素数であるため、sqrt(-16)はそのエラーを返します。彼らのコメントで述べたよう@not_a_robot

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

私は同意するが、複素数@thierryLathuilleで負の数の戻り値のためにsqrtを使用すると、平方根関数に別の問題がある。 – user229204

+0

正方形が正である。 –

0

それは(多くの)他のプログラミング言語であるとして、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) 
関連する問題