【问题标题】:Euclidean distance in PythonPython中的欧几里得距离
【发布时间】:2015-08-21 17:36:13
【问题描述】:

我有两个 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))),但它并没有达到我的目的。请问有什么方法可以计算距离吗?我会很感激任何 cmets。

【问题讨论】:

  • 您是否将向量存储在列表中?
  • 是的,在 2 个不同的文件中。以下帖子回答了我的问题。无论如何,谢谢。

标签: python numpy scipy distance


【解决方案1】:

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

要仅计算相应行索引之间的距离,您可以使用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))

【讨论】:

    【解决方案2】:

    这是另一种可行的方法。它仍然使用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_vec1 - process_vec2, axis=1))会比使用map快得多,后者在Python而不是C中隐式迭代行。
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2010-12-15
    • 2012-03-13
    • 2015-07-15
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多