Математическая ошибка евклидова расстояния

import math
from math import sqrt

Hailey=[0,4,1,4,0,0,4,1]
Verica=[3,0,0,5,4,2.5,3,0]
temp=[]
distance=0
x=0

for i in range(0,len(Hailey)):
    if (Hailey[i]!=0 and Verica[i]!=0):
        temp[x]=math.sqrt(abs(Hailey[i]**2) - abs(Verica[i]**2))
        x=x+1
for i in range(0,len(temp)):
    distance=distance+temp[i]
print("distance is",distance)   

Я пытаюсь сделать программу, которая находит евклидово расстояние между двумя людьми. Это не кажется математически корректным, и я получаю следующее:

    distance=distance + math.sqrt(abs(Hailey[i]**2) - abs(Verica[i]**2))
ValueError: math domain error

person IseNgaRt    schedule 12.09.2014    source источник
comment
Хейли = [0,4,1,4,0,0,4,1] ** я случайно стер 1 цифру при копировании / вставке   -  person IseNgaRt    schedule 12.09.2014
comment
Ваша следующая ошибка возникнет из-за того, что вы не можете добавить в список, назначив несуществующий индекс. Избавьтесь от x и используйте temp.append(math.sqrt(...)).   -  person chepner    schedule 12.09.2014
comment
Примечание: for i in range(0,len(temp)): обычно не самый питонический подход.   -  person Teepeemm    schedule 13.09.2014


Ответы (1)


Вы используете неправильную формулу. Вот правильная формула:

>>> math.sqrt(sum((h-v)**2 for h, v in zip(Hailey, Verica)))
7.158910531638177

Или, если вы хотите использовать NumPy:

>>> Hailey = numpy.array([0,4,1,4,0,0,4,1])
>>> Verica = numpy.array([3,0,0,5,4,2.5,3,0])
>>> numpy.linalg.norm(Hailey - Verica)
7.1589105316381767
person NPE    schedule 12.09.2014
comment
я думаю, это намного лучше, чем у меня, хотя я все еще получаю ошибку: temp [x] = math.sqrt (sum (h-v) ** 2 для h, v в zip (Hailey, Verica)) TypeError: требуется float - person IseNgaRt; 12.09.2014