用python中的多重列表计算欧氏距离

用python中的多重列表计算欧氏距离,python,list,euclidean-distance,Python,List,Euclidean Distance,我正在编写一个简单的程序,用python计算多个列表之间的欧几里德距离。这就是我的代码,太胖了 import math euclidean = 0 euclidean_list = [] euclidean_list_complete = [] test1 = [[0.0, 0.0, 0.0, 152.0, 12.29], [0.0, 0.0, 0.357, 245.0, 10.4], [0.0, 0.0, 0.10, 200.0, 11.0]] test2 = [[0.0, 0.0, 0.

我正在编写一个简单的程序,用python计算多个列表之间的欧几里德距离。这就是我的代码,太胖了

import math
euclidean = 0
euclidean_list = []
euclidean_list_complete = []

test1 = [[0.0, 0.0, 0.0, 152.0, 12.29], [0.0, 0.0, 0.357, 245.0, 10.4], [0.0, 0.0, 0.10, 200.0, 11.0]]

test2 = [[0.0, 0.0, 0.0, 72.0, 12.9], [0.0, 0.0, 0.0, 80.0, 11.3]]

for i in range(len(test2)):
    for j in range(len(test1)):
        for k in range(len(test1[0])):
            euclidean += pow((test2[i][k]-test1[j][k]),2)

        euclidean_list.append(math.sqrt(euclidean))
        euclidean = 0

    euclidean_list_complete.append(euclidean_list)


print euclidean_list_complete
我对这段代码的问题是它不能正确打印我想要的输出。输出应该是 [80.0023173.018128.014]、[72.006165.002、120.000]]

但实际上,它是打印的

[[80.00232559119766,173.01843095173416,128.01413984400315,72.00680592832875,165.0028407300917,120.00041666594329],[80.0023255911976173.01843095173416,128.01413984400315,72.006805928375,165.0028407300917,120.00041666594329]]

我猜这和循环有关。我该怎么做才能修好它?顺便说一下,我不想用numpy或scipy来学习


如果不清楚,我想计算test2上的列表到test1上的每个列表之间的距离,技巧是在第一个for循环中创建第一个欧几里德列表,然后在将其添加到完整的欧几里德列表后删除该列表

import math
euclidean = 0

euclidean_list_complete = []

test1 = [[0.0, 0.0, 0.0, 152.0, 12.29], [0.0, 0.0, 0.357, 245.0, 10.4], [0.0, 0.0, 0.10, 200.0, 11.0]]

test2 = [[0.0, 0.0, 0.0, 72.0, 12.9], [0.0, 0.0, 0.0, 80.0, 11.3]]

for i in range(len(test2)):
    euclidean_list = []
    for j in range(len(test1)):
        for k in range(len(test1[0])):
            euclidean += pow((test2[i][k]-test1[j][k]),2)      
        euclidean_list.append(math.sqrt(euclidean))
        euclidean = 0
        euclidean_list.sort(reverse=True)
    euclidean_list_complete.append(euclidean_list)
    del euclidean_list

print euclidean_list_complete

不确定3个向量要实现什么,但对于2个向量,代码必须非常非常简单:

test2 = [[0.0, 0.0, 0.0, 72.0, 12.9], [0.0, 0.0, 0.0, 80.0, 11.3]]

def distance(list1, list2):
    """Distance between two vectors."""
    squares = [(p-q) ** 2 for p, q in zip(list1, list2)]
    return sum(squares) ** .5

d2 = distance(test2[0], test2[1])  
与numpy的关系甚至是一个问题


PS.python 3建议

这个问题已由@Evgeny部分回答。OP针对自己的问题给出的答案是一个如何不编写Python代码的示例。下面是一个更短、更快、更可读的解决方案,因为test1和test2是问题中的列表:

test1 = [[0.0, 0.0, 0.0, 152.0, 12.29], [0.0, 0.0, 0.357, 245.0, 10.4], [0.0, 0.0, 0.10, 200.0, 11.0]]

test2 = [[0.0, 0.0, 0.0, 72.0, 12.9], [0.0, 0.0, 0.0, 80.0, 11.3]]

final_list = []

for a in test2:
    temp = [] #temporary list
    for b in test1:
        dis = sum([pow(a[i] - b[i], 2) for i in range(len(a))])
        temp.append(round(pow(dis, 0.5),4))

    final_list.append(temp)
print(final_list)
def euclidean(v1, v2):
    return sum((p-q)**2 for p, q in zip(v1, v2)) ** .5

d2 = []
for i in test2:
    foo = [euclidean(i, j) for j in test1]
    d2.append(foo)


print(d2)
#[[80.00232559119766, 173.01843095173416, 128.01413984400315],
# [72.00680592832875, 165.0028407300917, 120.00041666594329]]

这是因为dista,b=distb,a。消除冗余计算的最简单方法是只循环一半的项。@MateenUlhaq所说的是正确的。如果有调试器,可以通过使用调试器单步执行代码来查找这些内容。或者手动跟踪所有步骤。这是劳动密集型的,但能真正帮助你学习。无论如何,祝你学习顺利!我试着理解这个问题,让test1有[a,b,c],test2有[c,d],你们计算距离要取哪个点?@S.L.Barth我试着用一个可视化工具从某个网站上可视化它,直到i的第一次迭代,我都得到了它。但后来我意识到,在第二次迭代中,剩余的值也会出现在欧几里得列表中。在这种情况下,它不应该打印[[80.00232559119766173.01843095173416128.01413984400315],[80.00232559119766173.01843095173416128.0141398440031572.00680592832875165.0028407300917120.00041666594329]?@MohanBabu我的错,我应该写得更准确些。设test1为[a,b,c],test2为[d,e]。我想计算d到a,b,c和e到a,b,c之间的距离,这是非常有用的。我确实意识到我自己的代码不好,这就是为什么我说我这样做是为了学习。但这个答案很好,也很有帮助。谢谢@MaxPowers-从您的代码中,我终于理解了两组向量之间距离的意图,OPOnce要求我们进行改进,也可以列出comp而不是循环来计算成对列表def group_distance vector_list1,vector_list2:return[[euclideanv1,v2代表向量中的v2]代表向量中的v1]