繁体   English   中英

Python中的欧式距离

[英]Euclidean distance in Python

我有两个3000x3向量,我想计算它们之间的1比1欧几里得距离。 例如,vec1是

1 1 1  
2 2 2    
3 3 3  
4 4 4  
...

vec2是

2 2 2
3 3 3  
4 4 4  
5 5 5  
...

我想得到的结果是

1.73205081  
1.73205081
1.73205081
1.73205081
...

我尝试了scipy.spatial.distance.cdist(vec1,vec2) ,它返回3000x3000矩阵,而我只需要主对角线。 我也尝试了np.sqrt(np.sum((vec1-vec2)**2 for vec1,vec2 in zip(vec1,vec2))) ,它对于我的目的不起作用。 请问有什么方法可以计算距离吗? 我将不胜感激。

cdist给您一个3000 x 3000的数组,因为它可以计算两个输入数组中每行向量之间的距离。

要仅计算相应行索引之间的距离,可以使用np.linalg.norm

a = np.repeat((np.arange(3000) + 1)[:, None], 3, 1)
b = a + 1

dist = np.linalg.norm(a - b, axis=1)

或使用标准向量化数组操作:

dist = np.sqrt(((a - b) ** 2).sum(1))

这是另一种可行的方法。 它仍然使用np.linalg.norm函数,但是会处理数据(如果需要的话)。

import numpy as np
vec1='''1 1 1
    2 2 2
    3 3 3
    4 4 4'''
vec2='''2 2 2
    3 3 3
    4 4 4
    5 5 5'''

process_vec1 = np.array([])
process_vec2 = np.array([])

for line in vec1:
    process_vec1 = np.append( process_vec1, map(float,line.split()) )
for line in vec2:
    process_vec2 = np.append( process_vec2, map(float,line.split()) )

process_vec1 = process_vec1.reshape( (len(process_vec1)/3, 3) )
process_vec2 = process_vec2.reshape( (len(process_vec2)/3, 3) )

dist = np.linalg.norm( process_vec1 - process_vec2 , axis = 1 )

print dist

[1.7320508075688772 1.7320508075688772 1.7320508075688772 1.7320508075688772]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM