簡體   English   中英

在Python中使用多個列表計算歐幾里得距離

[英]Computing euclidean distance with multiple list in python

我正在編寫一個簡單的程序,使用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.0023, 173.018, 128.014], [72.006, 165.002, 120.000]]

但是,它打印

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

我猜想它與循環有關。 我該怎么解決? 順便說一句,我不想​​使用numpy或scipy進行學習

如果不清楚,我想計算test2的列表到test1的每個列表之間的距離

不確定要為3個向量實現的目標,但是對於兩個向量,代碼必須非常簡單:

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推薦

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)

@Evgeny已部分回答了該問題。 OP向他自己的問題發布的答案是如何不編寫Python代碼的示例。 給定test1test2是問題中的列表,這是一個更短,更快,更易讀的解決方案:

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]]

我明白了,技巧是在第一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM