Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算多维矩阵中的距离_Python_Euclidean Distance - Fatal编程技术网

Python 计算多维矩阵中的距离

Python 计算多维矩阵中的距离,python,euclidean-distance,Python,Euclidean Distance,我写了这个代码来计算距离。但是获取ValueError的错误:数学域错误 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)

我写了这个代码来计算距离。但是获取
ValueError的错误:数学域错误

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)

len(a)的值是2,对于从0开始的计数,因此,要求数组中的第三个元素,必须对范围内的i(len(a)-1)执行
当您尝试将其与负数一起使用时,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)

正如@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()
,因为它会更快地给出相同的结果,并且更易于阅读(和编写):


<代码> ^ 2 不为正方形,XORE。使用<代码> x**y>代码>将<代码> x <代码>提高到<代码> y>代码>第四个幂。当我计算DUI时,如何在同一行中将D小至4个小数点,还应该考虑使用内置函数使用它可能会更快。这个问题,您的答案无法解决,在于OP使用了
^
而不是
***
,这已经在评论中解释过了。是的,我同意,但如果我们在复数@thierrylahuillesquares中使用sqrt表示负数返回,平方根函数还有另一个问题。
范围(len(a))
将只生成从
0
len(a)-1(含)的值,因此您的建议不正确。
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)