Skip to main content
 首页 » 编程设计

python之使用 numpy 实现基于欧氏距离的公式

2025年05月04日17del

我正在尝试使用 numpy 在 python 中实现这个公式

如上图所示,X 是 numpy 矩阵,每个 xi 是一个 n 维向量,C 也是一个 numpy 矩阵,每个 Ci 也是 n 维向量,dist(Ci,xi) 是两者之间的欧氏距离这两个向量。 我用python实现了一段代码:

value = 0 
for i in range(X.shape[0]): 
    min_value = math.inf 
    #this for loop iterate k times 
    for j in range(C.shape[0]): 
        distance = (np.dot(X[i] - C[j], 
                           X[i] - C[j])) ** .5 
        min_value = min(min_value, distance) 
    value += min_value 
fitnessValue = value 

但我的代码性能不够好,我正在寻找更快的速度,有没有更快的方法在 python 中计算该公式,任何想法都将不胜感激。

请您参考如下方法:

通常,在 python 中应尽可能避免运行大量次数的循环。

这里,存在一个scipy函数scipy.spatial.distance.cdist(C, X),它计算C和X之间的成对距离矩阵。也就是说,如果你调用distance_matrix = scipy.spatial.distance.cdist(C, X),你有 distance_matrix[i, j] = dist(C_i, X_j)。

然后,对于每个 j,您想要计算所有 i 的 dist(C_i, X_j) 的最小值。你不需要循环来计算这个!如果您传递轴参数,函数 numpy.minimum 会为您完成。

最后,所有这些最小值的总和是通过调用 numpy.sum 函数完成的。

这使代码更具可读性和速度:

import scipy.spatial.distance 
import numpy as np 
def your_function(C, X): 
    distance_matrix = scipy.spatial.distance.cdist(C, X) 
    minimum = np.min(distance_matrix, axis=0) 
    return np.sum(minimum) 

它返回与您的函数相同的结果 :) 希望这对您有所帮助!