计算列表中所有向量之间欧几里德距离和闵可夫斯基距离的最快方法

2024-04-16 22:11:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经尝试了一段时间来计算列表中所有向量之间的欧几里德距离和闵可夫斯基距离。我没有太多的高级数学知识

  • 我通常使用4或5维向量
  • 向量列表的大小可以从0到大约200000
  • 计算距离时,所有矢量的维数都相同

在这个过程中,我依赖于这两个问题:

python numpy euclidean distance calculation between matrices of row vectors

Calculate Euclidean Distance between all the elements in a list of lists python

起初,我的代码如下所示:

import numpy as np

def euclidean_distance_np(vec_list, single_vec):
    dist = (np.array(vec_list) - single_vec) ** 2
    dist = np.sum(dist, axis=1)
    dist = np.sqrt(dist)
    return dist

def minkowski_distance_np(vec_list, single_vec, p_val):
    dist = (np.abs(np.array(vec_list, dtype=np.int64) - single_vec) ** p_val).sum(axis=1) ** (1 / p_val)
    return dist

当我有少量的向量时,这很有效。我会计算一个向量到列表中所有向量的距离,然后对列表中的每个向量逐一重复这个过程, 但一旦列表长度变为5或6位,这些函数就会变得非常缓慢

我设法改进了欧几里德距离计算,如下所示:

x = np.array([v[0] for v in vec_list])
y = np.array([v[1] for v in vec_list])
z = np.array([v[2] for v in vec_list])
w = np.array([v[3] for v in vec_list])
t = np.array([v[4] for v in vec_list])

res = np.sqrt(np.square(x - x.reshape(-1,1)) + np.square(y - y.reshape(-1,1)) + np.square(z - z.reshape(-1,1)) + np.square(w - w.reshape(-1,1)) + np.square(t - t.reshape(-1,1)))

但无法理解如何实现上述计算方法以正确计算Minkowski距离。 所以,准确地说,我的问题是,我如何能够以类似于我上面提到的代码的方式计算Minkowski距离

我也希望有任何改进意见或更好的方法来进行计算


Tags: in距离列表fordistnpvalarray
1条回答
网友
1楼 · 发布于 2024-04-16 22:11:18

Scipy已经实现了距离函数:minkowskieuclidean。但也许你需要的是cdist

Numpy是矩阵操作的绝佳工具,但它并不包含所有可能的函数。你可以在SciPy中找到更多与数学、科学和工程相关的附加功能和操作

相关问题 更多 >