मुझे उन तत्वों को हटाने के लिए एक सरणी फ़िल्टर करने की आवश्यकता है जो एक निश्चित सीमा से कम हैं। मेरा वर्तमान कोड इस प्रकार है:
threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))
समस्या यह है कि यह एक अस्थायी सूची बनाता है, जिसमें लैम्बडा फ़ंक्शन (धीमी) के साथ एक फिल्टर का उपयोग किया जाता है।
जैसा कि यह एक काफी सरल ऑपरेशन है, हो सकता है कि एक संख्यात्मक कार्य हो जो इसे एक कुशल तरीके से करता है, लेकिन मैं इसे खोजने में असमर्थ रहा हूं।
मैंने सोचा है कि इसे प्राप्त करने का एक और तरीका सरणी को छांटना हो सकता है, दहलीज के सूचकांक को ढूंढना और उस सूचकांक से एक टुकड़ा को बाद में वापस करना, लेकिन भले ही यह छोटे इनपुट के लिए तेज हो (और यह वैसे भी ध्यान देने योग्य नहीं होगा ), इसकी निश्चित रूप से asymptotically कम कुशल के रूप में इनपुट आकार बढ़ता है।
कोई विचार? धन्यवाद!
अद्यतन : मैंने कुछ माप भी लिए, और छँटाई + टुकड़ा करना तब भी शुद्ध अजगर फिल्टर की तुलना में दोगुना था जब इनपुट 100.000.000 प्रविष्टियाँ थी।
In [321]: r = numpy.random.uniform(0, 1, 100000000)
In [322]: %timeit test1(r) # filter
1 loops, best of 3: 21.3 s per loop
In [323]: %timeit test2(r) # sort and slice
1 loops, best of 3: 11.1 s per loop
In [324]: %timeit test3(r) # boolean indexing
1 loops, best of 3: 1.26 s per loop