2012-02-23 30 views
5

Tôi muốn calcuate khoảng cách eucledian trong nhiều kích thước (24 kích thước) giữa 2 mảng. Tôi đang sử dụng Numpy-Scipy.Khoảng cách đa chiều Eucledian trong Python

Đây là mã của tôi:

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]); 

Tuy nhiên, tôi đã sử dụng scipy.spatial.distance.cdist(A[numpy.newaxis,:],B,'euclidean') để calcuate khoảng cách eucleidan.

Nhưng nó đã cho tôi một lỗi

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

Tôi dường như không hiểu được nó.

Tôi đã tra cứu scipy.spatial.distance.pdist nhưng không hiểu cách sử dụng?

Có cách nào khác tốt hơn để làm điều đó không?

+2

Có lẽ ['scipy.spatial.distance.euclidean'] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.euclidean.html#scipy.spatial.distance. euclide)? –

+0

nhanh và dễ dàng! Cảm ơn. – garak

+1

Vì vậy, bạn có 2, điểm 24 chiều? Trong trường hợp đó, câu trả lời của @ Mr.E là lựa chọn tốt nhất. Tuy nhiên, khi bạn có nhiều hơn 2 điểm, các hàm 'scipy.spatial.distance' khác nhau sẽ hiệu quả hơn. –

Trả lời

9

Sử dụng một trong hai

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

hoặc đơn giản hơn

numpy.linalg.norm(A - B) 
7

AB là 2 điểm trong không gian 24-D. Bạn nên sử dụng scipy.spatial.distance.euclidean.

Doc here

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

Ngoài những cách đã được đề cập trong tính toán khoảng cách Euclide, đây là một trong đó là gần với mã ban đầu của bạn:

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

hoặc

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

lợi nhuận này 1 × 1 np.ndarray giữ khoảng cách L2.

1

Vì tất cả các câu trả lời trên đề cập đến NumPy và hay scipy, chỉ muốn chỉ ra rằng một cái gì đó thực sự đơn giản có thể được thực hiện với giảm đây

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)) 

này sẽ tổng hợp tất cả các cặp (a [j] - b [j])^2 cho tất cả j trong số các kích thước (lưu ý rằng để đơn giản điều này không hỗ trợ n < khoảng cách 2 chiều).

Các vấn đề liên quan