2012-02-23 12 views
5

मैं 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') इस्तेमाल किया eucleidan दूरी calcuate रहे हैं:

यहाँ मेरी कोड है।

लेकिन यह मुझे एक त्रुटि

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

तो, आपके पास 2, 24-आयामी बिंदु हैं? उस स्थिति में, @ श्री ई का जवाब सबसे अच्छा विकल्प है। हालांकि, जब आपके पास 2 से अधिक अंक होते हैं, तो विभिन्न 'scipy.spatial.distance' फ़ंक्शन अधिक कुशल होंगे। –

उत्तर

9

उपयोग या तो

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

या अधिक बस

numpy.linalg.norm(A - B) 
7

A और B 24-डी अंतरिक्ष में 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') 

यह रिटर्न:

Doc here

scipy.spatial.distance.euclidean(A, B) 
4
कंप्यूटिंग इयूक्लिडियन दूरी की पहले ही उल्लेख तरीके से

अलावा, यहाँ एक है कि अपने मूल कोड के करीब है एक 1 × 1 np.ndarray एल 2 दूरी पकड़े हुए।

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

यह के सभी जोड़े (एक [जे] योग के साथ करना चाहता था - बी [जे])^2 सभी जे के आयामों की संख्या में (ध्यान दें कि सादगी के लिए यह n < 2 आयामी दूरी का समर्थन नहीं करता है)।

संबंधित मुद्दे