2012-02-23 106 views
5

我想計算2個數組之間多維(24維)的核核距離。我正在使用Numpy-Scipy。Python中的多維核心距離

這裏是我的代碼:

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')到calcuate的eucleidan距離。

但它給了我一個錯誤

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

我似乎並不瞭解它。我看了一下scipy.spatial.distance.pdist但是不明白怎麼用它?

還有其他更好的方法嗎?

+2

也許['scipy.spatial.distance.euclidean'](http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.euclidean.html#scipy.spatial.distance。歐幾里德)? – 2012-02-23 14:16:19

+0

快速簡單!謝謝。 – garak 2012-02-23 14:21:17

+1

那麼,你有2個24維點?在這種情況下,@E先生的回答是最好的選擇。但是,如果您的分數超過2分,各種'scipy.spatial.distance'函數將更加高效。 – 2012-02-23 14:26:44

回答

9

選其一

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

或更簡單地

numpy.linalg.norm(A - B) 
7

AB是在24 d空間2分。你應該使用scipy.spatial.distance.euclidean

Doc here

scipy.spatial.distance.euclidean(A, B) 
4
從計算的歐氏距離的已經提到的方式

除此之外,這裏有一個很接近你原來的代碼:

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

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

這將返回保持L2距離的1×1np.ndarray

1

由於所有上述答案是指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]。 - b [j])^ 2對於維數中的所有j(注意,爲了簡單起見,這不支持n維距離)。

相關問題