मैं एक numpy सरणी में 1 के लगातार स्पैन का पता लगाने के लिए चाहता हूँ। दरअसल, मैं पहले यह पहचानना चाहता हूं कि सरणी में तत्व कम से कम तीन 1 की अवधि में है या नहीं। उदाहरण के लिए, हमारे पास निम्न सरणी है:numpy: एक सरणी में लगातार 1 का पता लगाएं
import numpy as np
a = np.array([1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0])
फिर निम्न 1 में बोल्ड में तत्व तत्वों को पूरा करते हैं।
[1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 , 1, 1, 1, 1, 1, 0]
इसके बाद, 1 की के दो फैला द्वारा अधिक से अधिक दो 0 के अलग होती है, तो दो फैला ऊपर एक लंबे समय तक काल बनाते हैं। तो ऊपर सरणी
रूप charaterized है [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0]
दूसरे शब्दों में, इनपुट के रूप में मूल सरणी के लिए, मैं उत्पादन चाहते हैं इस प्रकार है:
[True, True, True, True, True, True, True, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, False]
मैं के बारे में सोच कर दिया गया है इस फ़ंक्शन को लागू करने के लिए एक एल्गोरिदम, लेकिन मैं जिस के साथ आता हूं वह जटिल लगता है ईडी। तो मुझे इसे लागू करने के बेहतर तरीके जानना अच्छा लगेगा - अगर कोई मेरी मदद कर सकता है तो इसकी बहुत सराहना की जाएगी।
अद्यतन:
मैं माफी माँगता हूँ कि मैं अपने प्रश्न स्पष्ट नहीं किया। मैं 1 की अवधि के रूप में सरणी में 3 या अधिक लगातार 1 की पहचान करना चाहता हूं, और 1 के किसी भी दो स्पैन के बीच केवल एक या दो 0 के बीच पहचान की जाती है, अलग-अलग 0 के साथ, एक लंबी अवधि के रूप में। मेरा लक्ष्य निम्न तरीके से समझा जा सकता है: यदि 1 के स्पैन के बीच केवल एक या दो 0 हैं, तो मैं उन 0 को त्रुटियों के रूप में मानता हूं और उन्हें 1 के रूप में सही किया जाना चाहिए।
@ ritesht93 ने एक उत्तर दिया जो लगभग मुझे जो चाहिए वह देता है। हालांकि, वर्तमान उत्तर उस मामले की पहचान नहीं करता है जब 1 के तीन स्पैन होते हैं जो 0 के द्वारा अलग होते हैं, जिन्हें एक एकल अवधि के रूप में पहचाना जाना चाहिए। उदाहरण के लिए, सरणी
a2 = np.array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0])
के लिए हम उत्पादन प्राप्त करना चाहिए
[False, True, True, True, True, True, True, True, True,
True, True, True, True, True, False, False, False, False,
False, True, True, True, True, True, False]
अद्यतन 2:
मैं बहुत से प्रेरित था और नियमित अभिव्यक्ति के आधार पर एल्गोरिथ्म पाया करने के लिए सबसे आसान है कार्यान्वित करें और समझने के लिए - हालांकि मैं अन्य विधियों की तुलना में कुशल के बारे में निश्चित नहीं हूं। आखिरकार मैंने निम्नलिखित विधि का इस्तेमाल किया।
lst = np.array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0])
lst1 = re.sub(r'1{3,}', lambda x:'c'*len(x.group()), ''.join(map(str, lst)))
print lst1
जो 1 के
0ccc0ccc00cccc00100ccccc0
का फैला पहचान और उसके बाद का फैला कनेक्ट 1 के
lst2 = re.sub(r'c{1}0{1,2}c{1}', lambda x:'c'*len(x.group()), ''.join(map(str, lst1)))
print lst2
जो देता है
0ccccccccccccc00100ccccc0
अंतिम परिणाम
0 द्वारा दिया जाता हैnp.array(list(lst2)) == 'c'
array([False, True, True, True, True, True, True, True, True,
True, True, True, True, True, False, False, False, False,
False, True, True, True, True, True, False])
"सरणी विशेषता के रूप में:" और "उत्पादन चाहते हैं इस प्रकार है" एक दूसरे के विपरीत है: पदों 8 और 9 एक "काल" का हिस्सा होना चाहिए ("सही") या नहीं (बोल्ड नहीं) ? – hvwaldow
@hvwaldow हाँ, आप सही हैं। यह बात बताने के लिए धन्यवाद। एरियल ने सही किया। – user3821012
"हालांकि, वर्तमान उत्तर उस मामले की पहचान नहीं करता है जब 1 के तीन स्पैन होते हैं जो 0 के द्वारा अलग होते हैं ...." हम्म। मुझे यह नहीं दिख रहा है। मेरा जवाब आपके दूसरे टेस्टकेस के लिए सही समाधान का उत्पादन प्रतीत होता है। – hvwaldow