जैसे पूर्णांक की एक सरणी दी
[1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5]
मुझे ऐसे तत्वों को मुखौटा बनाने की आवश्यकता है जो N
समय से अधिक दोहराते हैं । स्पष्ट करने के लिए: प्राथमिक लक्ष्य बूलियन मुखौटा सरणी को पुनः प्राप्त करना है, बाद में गणना के लिए इसका उपयोग करना।
मैं एक जटिल समाधान के साथ आया था
import numpy as np
bins = np.array([1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5])
N = 3
splits = np.split(bins, np.where(np.diff(bins) != 0)[0]+1)
mask = []
for s in splits:
if s.shape[0] <= N:
mask.append(np.ones(s.shape[0]).astype(np.bool_))
else:
mask.append(np.append(np.ones(N), np.zeros(s.shape[0]-N)).astype(np.bool_))
mask = np.concatenate(mask)
उदाहरण के लिए
bins[mask]
Out[90]: array([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5])
क्या ऐसा करने का एक अच्छा तरीका है?
EDIT, # 2
उत्तर के लिए बहुत बहुत धन्यवाद! यहाँ MSeifert के बेंचमार्क प्लॉट का एक पतला संस्करण है। मुझे इशारा करने के लिए धन्यवाद simple_benchmark
। केवल 4 सबसे तेज़ विकल्प दिखा रहा है:
निष्कर्ष
पॉल पैंजर द्वारा संशोधित फ्लोरिअन एच द्वारा प्रस्तावित विचार इस समस्या को हल करने का एक शानदार तरीका प्रतीत होता है क्योंकि यह बहुत सीधे आगे और अकेला है। यदि आप हालांकि उपयोग करने के साथ ठीक हैं , तो MSeifert का समाधान दूसरे को बेहतर बनाता है ।numpy
numba
मैंने MSeifert के उत्तर को समाधान के रूप में स्वीकार करना चुना क्योंकि यह अधिक सामान्य उत्तर है: यह लगातार दोहराए जाने वाले तत्वों के साथ (गैर-अद्वितीय) ब्लॉकों के साथ मनमाने ढंग से सरणियों को संभालता है। मामले numba
में कोई जवाब नहीं है , दिवाकर का जवाब भी देखने लायक है!