Monday, 15 August 2011

python - Populate a dict with missing values -


चलो b कुछ मानों के साथ एक डिक्ट होना:

  बी [1 9, 1] = 100, बी [90, 1] = 100, बी [90, 55] = 101, बी [90, 127] = 102 बी [70, 1] = 40, बी [70, 45] = 41, बी [ 70, 107] = 42  

कैसे एक पास में, एक dict को अपने निकटतम पड़ोसी के रूप में निकटतम पड़ोसी के रूप में वर्गीकृत किया जाता है, उदाहरण के लिए 0 & lt; = i & lt; = 127 , 0 & lt; = j & lt; = 127 ? (यह विशेष रूप से 16384 कुंजी देगी, इसलिए मेरे आवेदन के लिए ठीक है)।

उदाहरण के तौर पर, मुझे b [73, 40] = b [70, 45] = 41 चाहिए , एक 2 डी विमान में ienearest neighboor।

यहाँ मैं जो कोशिश की:

  श्रेणी में i के लिए (127): सीमा के लिए जम्मू (127 ): (सी [1] - जे) ** 2) बी [आई, जे] = बी [बी] लेकिन यह बहुत धीमी है क्योंकि 127 * 127 छोरें हैं जिसमें हम सभी तत्वों को दूरी की गणना करने के लिए एक बार फिर लूप!  

हम एक डिक्ट के साथ निकटतम पड़ोसी के साथ अधिक कुशल तरीके से कैसे बना सकते हैं?

itemprop = "text">

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

  initial_keys = set (b.keys ()) के लिए मैं एक्सरेन्ज (127) में: जेआर में एक्सरेन्ज (127) : अगर (आई, जे) प्रारंभिक_कीओं में नहीं है: निकटतम_की = न्यूनतम (प्रारंभिक_कीज, कुंजी = लैम्ब्डा सी: (सी [0] - i) ** 2 + (सी [1] - जे) ** 2) बी [i, J] = b [closest_key]  

इस तरह से एल्गोरिथ्म के चलने का समय O (k * n ^ 2) से O (n ^ 4) , जहां n आयाम आकार और k आरंभिक कुंजियों की संख्या है।

संपादित करें:

< पी> आप महान गति सुधार के साथ numpy का उपयोग कर सकते हैं:

  np s = set (b.keys ()) x = np.array ([k एस के लिए [0] के लिए) y = np.array ([s] के लिए k के लिए [k [1]) मैं एक्सरेन्ज (128) में: एक्सरेन्ज में जे के लिए (128): यदि (i, j) S: argmin = np.argmin ((x - i) ** 2 + (y - j) ** 2) बी [i, j] = b [x [argmin], y [आर्गिन]]  < / प्री> 

No comments:

Post a Comment