2010-12-06 10 views
12

मैं नम्पी के लिए नया हूं और मैं आपको पूछना चाहता हूं कि वेक्टर में संग्रहीत बिंदुओं के बीच यूक्लिडियन दूरी की गणना कैसे करें।पंक्ति वैक्टर के मैट्रिस के बीच पायथन numpy euclidean दूरी गणना

मान लीजिए कि हमारे पास एक numpy.array है प्रत्येक पंक्ति एक वेक्टर और एक numpy.array है। मैं जानना चाहता हूं कि सभी बिंदुओं और इस बिंदु के बीच यूक्लिडियन दूरी की गणना करना संभव है और उन्हें एक numpy.array में स्टोर करें।

points #2d list of row-vectors 
singlePoint #one row-vector 

listOfDistances= procedure(points,singlePoint) 

हम कुछ इस तरह हो सकता है:

यहाँ एक अंतरफलक है? या क्या अन्य बिंदुओं की सूची के रूप में एकल बिंदु रखने के लिए एक आदेश होना संभव है और अंत में हमें दूरी का मैट्रिक्स मिलता है?

धन्यवाद

+1

यद्यपि आप के बीच की दूरी गणना करना चाहते हैं एक बिंदु और अंक का एक सेट, मुझे लगता है कि scipy.spatial.distance.cdist अभी भी काम करता है। आपके पास 2 संग्रह हैं, जिनमें से एक में केवल 1 तत्व है। http://stackoverflow.com/questions/1871536/euclidean-distance-between-points-in-two- अलग- numpy-arrays-not-within –

+0

@JimRaynor +1 बिल्कुल वही था जो मुझे चाहिए :) – ocean800

उत्तर

16

जबकि आप वेक्टरटाइज़ का उपयोग कर सकते हैं, @ कार्ल का दृष्टिकोण numpy arrays के साथ धीमा होगा।

आसान तरीका केवल np.hypot(*(points - single_point).T) करना है। (ट्रांसपोज़ मानता है कि अंक 2xN की बजाय एक Nx2 सरणी है। यदि यह 2xN है, तो आपको .T की आवश्यकता नहीं है।

हालांकि यह थोड़ा अपठनीय है, इसलिए आप इसे और अधिक स्पष्ट रूप से लिखते हैं कुछ डिब्बाबंद उदाहरण डेटा ...):

import numpy as np 
single_point = [3, 4] 
points = np.arange(20).reshape((10,2)) 

dist = (points - single_point)**2 
dist = np.sum(dist, axis=1) 
dist = np.sqrt(dist) 
2

एक numpy सरणी के प्रत्येक तत्व के लिए एक समारोह लागू करने के लिए numpy.vectorize प्रयास करें।

वास्तविक गणना करने के लिए, हमें दो वैक्टरों में निर्देशांक के जोड़े के बीच मतभेदों (whew!) के वर्गों के वर्ग की वर्ग रूट की आवश्यकता है।

हम समन्वय जोड़ने के लिए zip का उपयोग कर सकते हैं, और sum परिणामों को पूरा करने के लिए समझ के साथ। ऐसा लगता है:

sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5 
3
import numpy as np 
def distance(v1, v2): 
    return np.sqrt(np.sum((v1 - v2) ** 2))  
+1

क्या आप समझा सकते हैं आपका कोड क्या करता है इसके बारे में अधिक जानकारी? – Athafoud

+0

यह उपरोक्त जैसा ही है लेकिन एक पंक्ति में है –

0

दूरी आप numpy में linalg मॉड्यूल के आदर्श विधि का उपयोग कर सकते हैं पाने के लिए:

np.linalg.norm(x - y)