2012-02-23 40 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]); 

は、しかし、私はeucleidan距離をcalcuateするscipy.spatial.distance.cdist(A[numpy.newaxis,:],B,'euclidean')を使用:

は、ここに私のコードです。

しかし、それは私がそれを理解していないよう私にエラー

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。ユークリッド)? –

+0

これはすばやく簡単でした!ありがとう。 – garak

+1

だから、あなたは、24次元のポイントを持っていますか?その場合、@ Mr.Eの答えは最良の選択肢です。しかし、2つ以上のポイントがある場合は、さまざまな 'scipy.spatial.distance'関数がより効率的になります。 –

答えて

6

おそらくscipy.spatial.distance.euclidean?本当にシンプルなものがで行うことができることを指摘したかった上記の回答のすべて以来

9

使用

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

以上単に

numpy.linalg.norm(A - B) 
7

ABいずれかが24-D空間内の2点です。 scipy.spatial.distance.euclideanを使用してください。

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

または

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

これを返す:ユークリッド距離を計算する、既に述べた通りから離れて

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

Doc hereは、ここにあなたの元のコードに近いです一つですL1距離を保持する1×1 np.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]のすべてのペアを合計します次元数のすべてのjについて(2次元の距離は<をサポートしていないことに注意してください)。

関連する問題