[英]Multidimensional Euclidean Distance in Python
我想計算2個數組之間多維(24維)的歐幾里德距離。 我正在使用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')
euclidean scipy.spatial.distance.cdist(A[numpy.newaxis,:],B,'euclidean')
來計算eucleidan距離。
但它給了我一個錯誤
raise ValueError('XB must be a 2-dimensional array.');
我好像不明白。
我scipy.spatial.distance.pdist
了scipy.spatial.distance.pdist
但不明白如何使用它?
還有其他更好的方法嗎?
也許是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
使用其中之一
numpy.sqrt(numpy.sum((A - B)**2))
或者更簡單
numpy.linalg.norm(A - B)
除了已經提到的計算歐幾里德距離的方法之外,這里有一個與原始代碼接近的方法:
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
。
由於以上所有答案都涉及numpy和scipy,只是想指出一些非常簡單的事情可以通過減少來完成
def n_dimensional_euclidean_distance(a, b):
"""
Returns the euclidean distance for n>=2 dimensions
:param a: tuple with integers
:param b: tuple with integers
:return: the euclidean distance as an integer
"""
dimension = len(a) # notice, this will definitely throw a IndexError if len(a) != len(b)
return sqrt(reduce(lambda i,j: i + ((a[j] - b[j]) ** 2), range(dimension), 0))
這將對維度中所有j的所有對(a [j] - b [j])^ 2求和(注意,為簡單起見,這不支持n <2維距離)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.