2012-10-16 21 views
16

मैं एक 2 आयामी सरणी है:निकटतम पड़ोसी खोज: अजगर

MyArray = array([6588252.24, 1933573.3, 212.79, 0, 0], 
       [6588253.79, 1933602.89, 212.66, 0, 0], 
       etc...) 

पहले दो तत्वों MyArray[0] और MyArray[1] अंकों की एक्स और वाई निर्देशांक हैं।

सरणी में प्रत्येक तत्व के लिए, मैं खोजने के लिए तेजएक्स इकाइयों के दायरे में अपने एकल निकटतम पड़ोसी वापस जाने के लिए जिस तरह से करना चाहते हैं। हम मानते हैं कि यह 2 डी स्पेस में है।

इस उदाहरण के लिए X = 6 कहें।

मैंने प्रत्येक तत्व को हर दूसरे तत्व की तुलना करके समस्या हल कर दी है, लेकिन आपकी सूची 22k अंक लंबी होने पर 15 मिनट या इससे अधिक समय लेती है। हम अंततः 30 मिलियन अंक की सूचियों पर इसे चलाने की उम्मीद करते हैं।

मैंने के-डी पेड़ों के बारे में पढ़ा है और बुनियादी अवधारणा को समझ लिया है, लेकिन उन्हें समझने में परेशानी हुई है कि उन्हें कैसे स्क्रिप्ट करना है।

+0

"केटी पेड़" क्या है? आपका मतलब है "के-डी पेड़"? द्वि-आयामी बिंदुओं के लिए आपको केवल [क्वाड्री] (http://en.wikipedia.org/wiki/Quadtree) की आवश्यकता है। पाइथन में क्वाडट्री कार्यान्वयन की तलाश में एक पूर्व प्रश्न था: http://stackoverflow.com/questions/6060302/pure-python-quadtree- कार्यान्वयन –

+0

धन्यवाद! मेरा मतलब एक के-डी पेड़ था। मैं एक चौकोर पेड़ देख लूंगा। – Dlinet

+0

['scipy.spatial'] में एक के-डी पेड़ कार्यान्वयन है (http://docs.scipy.org/doc/scipy/reference/spatial.html) मॉड्यूल –

उत्तर

20

जॉन विनीर्ड को धन्यवाद देने के लिए धन्यवाद।

आवश्यक:: स्थापित Numpy और SciPy

  1. आयात SciPy और Numpy मॉड्यूल

  2. 5 की एक कॉपी बनाएं कुछ अच्छी अनुसंधान और परीक्षण के बाद, यहाँ इस सवाल का हल है आयामी सरणी केवल एक्स और वाई मान सहित। 6 इकाइयों के भीतर इस तरह के रूप

    YourTreeName = scipy.spatial.cKDTree(YourArray, leafsize=100) 
    #Play with the leafsize to get the fastest result for your dataset 
    
  3. क्वेरी निकटतम पड़ोसी के लिए cKDTree: प्रत्येक आइटम के लिए YourArray में

    for item in YourArray: 
        TheResult = YourTreeName.query(item, k=1, distance_upper_bound=6) 
    

    , TheResult होगा

  4. एक cKDTree का एक उदाहरण के रूप में बनाएं दो बिंदुओं के बीच की दूरी का एक झुकाव, और YourArray में बिंदु के स्थान की अनुक्रमणिका बनें।

उम्मीद है कि यह किसी और को मदद करता है जिसने केडी पेड़ के साथ भ्रम का अनुभव किया है!

+0

संग्रह के बजाय, केवल एक विशेष बिंदु के नजदीक के बारे में कैसे? –

+0

@ स्टेवेवायगो [query_ball_point] (http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.spatial.cKDTree.query_ball_point.html#scipy.spatial.cKDTree.query_ball_point) प्रतीत होता है इसके लिए उपलब्ध है। – ldavid

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