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

标签 python numpy matrix

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

enter image description here

如上图所示,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)

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

关于python - 使用 numpy 实现基于欧氏距离的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41043234/

相关文章:

c++ - 动态分配的矩阵读取不正确

javascript - 如何将鼠标移动距离转换为 SVG 坐标空间?

java - 有效地将不同的可能子串匹配到相同的值

python - 如何在 Pygame 上用操纵杆同时移动和射击?

python - 是否可以通过在 Raspberry Pi 上运行的 flutter 应用程序运行 python 脚本?

python - 将 numpy 结构化数组的字段插入 mongodb

c++ - 如何在不依赖 numpy.i 的情况下使用指针将 numpy 数组传递给 C++/SWIG?

python - MyPy 不允许将通用属性标记为最终属性

python - 有效地索引 numpy 数组邻居

python - 连接矩阵 PYTHON(无 numpy)