Python中的多维欧氏距离

时间:2012-02-23 14:13:45

标签: python numpy scipy cluster-analysis euclidean-distance

我想计算2个阵列之间多维(24维)的eucledian距离。我正在使用Numpy-Scipy。

这是我的代码:

import numpy,scipy;

A=numpy.array([116.629, 7192.6, 4535.66, 279714, 176404, 443608, 295522, 1.18399e+07, 7.74233e+06, 2.85839e+08, 2.30168e+08, 5.6919e+08, 168989, 7.48866e+06, 1.45261e+06, 7.49496e+07, 2.13295e+07, 3.74361e+08, 54.5, 3349.39, 262.614, 16175.8, 3693.79, 205865]);

B=numpy.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151246, 6795630, 4566625, 2.0355328e+08, 1.4250515e+08, 3.2699482e+08, 95635, 4470961, 589043, 29729866, 6124073, 222.3]);

但是,我使用scipy.spatial.distance.cdist(A[numpy.newaxis,:],B,'euclidean')来计算eucleidan距离。

但它给了我一个错误

raise ValueError('XB must be a 2-dimensional array.');

我似乎不明白。

我查了scipy.spatial.distance.pdist但不明白如何使用它?

还有其他更好的方法吗?

6 个答案:

答案 0 :(得分:11)

也许是scipy.spatial.distance.euclidean

  

实施例

>>> from scipy.spatial import distance
>>> distance.euclidean([1, 0, 0], [0, 1, 0])
1.4142135623730951
>>> distance.euclidean([1, 1, 0], [0, 1, 0])
1.0

答案 1 :(得分:10)

使用

numpy.sqrt(numpy.sum((A - B)**2))

或更简单

numpy.linalg.norm(A - B)

答案 2 :(得分:7)

AB在24-D空间中是2分。您应该使用scipy.spatial.distance.euclidean

Doc here

scipy.spatial.distance.euclidean(A, B)

答案 3 :(得分:4)

除了已经提到的计算欧几里德距离的方法之外,这里有一个接近原始代码的方法:

scipy.spatial.distance.cdist([A], [B], 'euclidean')

scipy.spatial.distance.cdist(np.atleast_2d(A), np.atleast_2d(B), 'euclidean')

这将返回保持L2距离的1×1 np.ndarray

答案 4 :(得分:3)

由于以上所有答案都涉及numpy和scipy,只是想指出一些非常简单的事情可以通过reduce来完成

background-clip:content-box;

这将对维度中所有j的所有对(a [j] - b [j])^ 2求和(注意,为简单起见,这不支持n&lt; 2维距离)。< / p>

答案 5 :(得分:1)

Python 3.8开始,您可以使用标准库的math模块及其新的dist函数,该函数返回两点之间的欧式距离(以坐标元组给出):

from python import math

dist((1, 0, 0), (0, 1, 0)) # 1.4142135623730951

使用列表而不是元组时:

dist(tuple([1, 0, 0]), tuple([0, 1, 0]))