2015-09-06 8 views
6

के भीतर सभी निकटतम पड़ोसियों को ढूंढें मेरे पास numpy सरणी में संग्रहीत x और y निर्देशांक की एक बड़ी सूची है।एक विशिष्ट दूरी

Coordinates = [[ 60037633 289492298] 
[ 60782468 289401668] 
[ 60057234 289419794]] 
... 
... 

मैं क्या चाहते हैं (की सुविधा देता है 3 मीटर का कहना है) एक विशिष्ट दूरी के भीतर सभी निकटतम पड़ोसियों खोजने के लिए और परिणाम की दुकान, ताकि मैं बाद में परिणाम पर कुछ आगे के विश्लेषण के लिए कर सकते हैं के लिए है।

अधिकांश पैकेजों के लिए मुझे पता चला कि यह तय करना आवश्यक है कि कितने एनएन पाए जाएंगे, लेकिन मैं बस सेट दूरी के भीतर सभी चाहता हूं।

मैं इस तरह कुछ कैसे प्राप्त कर सकता हूं और बड़े डेटासेट (कुछ मिलियन अंक) के लिए ऐसा कुछ हासिल करने का सबसे तेज़ और सबसे अच्छा तरीका क्या है?

+2

क्या आपने अभी तक ऐसा करने की कोशिश की है? आपका कोड अभी कैसा दिखता है? क्या आप एक उदाहरण दे सकते हैं कि आप गणना करने की कोशिश कर रहे हैं (यानी 3 मीटर का मतलब क्या है)? क्या ये जीपीएस निर्देशांक हैं? – reynoldsnlp

+0

'scipy आयात स्थानिक myTreeName = spatial.cKDTree (निर्देशांक, leafsize = 100) निर्देशांक में आइटम के लिए से: TheResult = myTreeName.query (आइटम k = 20, distance_upper_bound = 3)' क्या मैं पहले लेकिन कोशिश की है यहां मुझे यह निर्दिष्ट करना होगा कि मैं कितने निकटतम पड़ोसियों को ढूंढना चाहता हूं। हां वे जीपीएस निर्देशांक (एक्स, वाई) हैं और मैं डेटासेट में प्रत्येक बिंदु के लिए 3 मीटर की त्रिज्या के भीतर सभी एनएन खोजना चाहता हूं। – Kitumijasi

उत्तर

9

आप इस्तेमाल कर सकते हैं एक scipy.spatial.cKDTree:

:

import numpy as np 
import scipy.spatial as spatial 
points = np.array([(1, 2), (3, 4), (4, 5)]) 
point_tree = spatial.cKDTree(points) 
# This finds the index of all points within distance 1 of [1.5,2.5]. 
print(point_tree.query_ball_point([1.5, 2.5], 1)) 
# [0] 

# This gives the point in the KDTree which is within 1 unit of [1.5, 2.5] 
print(point_tree.data[point_tree.query_ball_point([1.5, 2.5], 1)]) 
# [[1 2]] 

# More than one point is within 3 units of [1.5, 1.6]. 
print(point_tree.data[point_tree.query_ball_point([1.5, 1.6], 3)]) 
# [[1 2] 
# [3 4]] 

यहाँ दिखा कैसे आप , अंक की एक सरणी के लिए सभी निकटतम पड़ोसियों पा सकते हैं एक कॉल point_tree.query_ball_point के साथ एक उदाहरण है

import numpy as np 
import scipy.spatial as spatial 
import matplotlib.pyplot as plt 
np.random.seed(2015) 

centers = [(1, 2), (3, 4), (4, 5)] 
points = np.concatenate([pt+np.random.random((10, 2))*0.5 
         for pt in centers]) 
point_tree = spatial.cKDTree(points) 

cmap = plt.get_cmap('copper') 
colors = cmap(np.linspace(0, 1, len(centers))) 
for center, group, color in zip(centers, point_tree.query_ball_point(centers, 0.5), colors): 
    cluster = point_tree.data[group] 
    x, y = cluster[:, 0], cluster[:, 1] 
    plt.scatter(x, y, c=color, s=200) 

plt.show() 

enter image description here

+1

मुझे विश्वास है कि इसके बजाय ['spatial.cKDTree'] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.html) का उपयोग करने की अनुशंसा की जाती है। (मेरा मानना ​​है कि एकमात्र अंतर, कार्यान्वयन है ... व्यवहार और इंटरफ़ेस समान है।) – askewchan

+0

सुधार के लिए धन्यवाद, @askewchan। 'सीकेडी ट्री 'तेज होना चाहिए। – unutbu

+0

ओ.के. अब अगर मैं आपकी क्वेरी को बहुत से अंक बनाना चाहता हूं या अंक कैसे प्राप्त करता हूं तो मैं क्वेरी पॉइंट के साथ निकटतम बिंदुओं को कैसे संग्रहीत कर सकता हूं? तो आपके उदाहरण में कुछ: '(1.5: 1 2) (1.6: 3 4)' इंडेक्स, डिक्शनरी या ट्यूपल या ऐसा कुछ पसंद है? – Kitumijasi

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