Python 中的欧氏距离
Euclidean distance in Python
我有两个 3000x3 向量,我想计算它们之间的一对一欧氏距离。比如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)
,它returns 是一个 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]
我有两个 3000x3 向量,我想计算它们之间的一对一欧氏距离。比如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)
,它returns 是一个 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]