2012-02-23 12 views
5

Voglio calcolare la distanza eucledian in più dimensioni (24 dimensioni) tra 2 array. Sto usando Numpy-Scipy.Distanza di eucledian multidimensionale in Python

Ecco il mio codice:

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

Tuttavia, ho usato scipy.spatial.distance.cdist(A[numpy.newaxis,:],B,'euclidean') al calcuate la distanza eucleidan.

Ma mi ha dato un errore

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

non mi sembra di capire.

Ho cercato scipy.spatial.distance.pdist ma non capisco come usarlo?

C'è qualche altro modo migliore per farlo?

+2

Forse ['scipy.spatial.distance.euclidean'] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.euclidean.html#scipy.spatial.distance. euclideo)? –

+0

è stato semplice e veloce! Grazie. – garak

+1

Quindi hai 2, 24 punti dimensionali? In tal caso, la risposta @ Mr.E è l'opzione migliore. Tuttavia, quando si hanno più di 2 punti, le varie funzioni 'scipy.spatial.distance' saranno più efficienti. –

risposta

9

utilizzare uno

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

o più semplicemente

numpy.linalg.norm(A - B) 
7

A e B sono 2 punti nello spazio 24-D. Dovresti usare scipy.spatial.distance.euclidean.

Doc here

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

Oltre alle vie già citate del calcolo della distanza euclidea, ecco uno che è vicino al vostro codice originale:

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

o

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

Ciò restituisce a 1 × 1 np.ndarray mantenendo la distanza L2.

1

Poiché tutte le risposte di cui sopra si riferiscono a NumPy eo SciPy, volevo solo far notare che qualcosa di veramente semplice può essere fatto con ridurre qui

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

Ciò sommare tutte le coppie di (A [j] - b [j])^2 per tutti i j nel numero di dimensioni (notare che per semplicità questo non supporta la distanza bidimensionale n. <).

Problemi correlati