Python中的欧几里德距离

Python中的欧几里德距离,python,numpy,scipy,distance,Python,Numpy,Scipy,Distance,我有两个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.space.distance.cdist(vec1,vec2),它返回一个3000x3000矩阵,而我只需要主对角线

我有两个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.space.distance.cdist(vec1,vec2)
,它返回一个3000x3000矩阵,而我只需要主对角线。我还尝试了
np.sqrt(np.sum((vec1-vec2)**2代表vec1,vec2代表zip(vec1,vec2))
,但它没有达到我的目的。请问有没有办法计算距离?如果您有任何意见,我将不胜感激。

cdist
返回3000 x 3000数组,因为它计算两个输入数组中每对行向量之间的距离

要仅计算相应行索引之间的距离,可以使用:

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

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]

是否将向量存储在列表中?是的,存储在两个不同的文件中。下面的帖子回答了我的问题。无论如何,谢谢。一般来说,使用向量化来处理多行(例如
np.linalg.norm(process\u vec1-process\u vec2,axis=1)
)要比使用
map
快得多,后者在Python中隐式地迭代行,而不是在C中。
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