2012-03-27 17 views
5

क्या Python3/Numpy में कोई अंतर्निहित फ़ंक्शन है जो एक सरणी फ़िल्टर करता है और शेष तत्वों के सूचकांक देता है? सॉर्टिंग के लिए numpy.argsort के समान कुछ। मेरे पास फ़िल्टर न्यूनतम और अधिकतम थ्रेसहोल्ड दोनों सेट कर रहा है - नीचे/ऊपर न्यूनतम/अधिकतम सभी मान फ़िल्टर किए जाने हैं।Python3/Numpy में एक सरणी फ़िल्टर करें और सूचकांक

मैंने पाइथन के फ़ंक्शन filter को देखा है, लेकिन मुझे इसका उपयोग करके इंडेक्स निकालने का कोई तरीका नहीं दिख रहा है।

संपादित: उत्तर में बहुत उपयोगी जानकारी, धन्यवाद!

@SvenMarnach के रूप में बताया, मुखौटा पर्याप्त है:

mask = (min_value < a) & (a < max_value) 

अब मैं a रूप में एक ही आकार के अन्य सारणियों को यह मुखौटा लागू करने के लिए है, लेकिन यकीन नहीं यह करने के लिए सबसे अच्छा तरीका क्या है। ..

उत्तर

4

आपको लगता है कि

indices = ((min_value < a) & (a < max_value)).nonzero()[0] 
साथ एक से अधिक min_value और लेस max_value से कर रहे हैं एक आयामी सरणी a में तत्वों की सूचकांकों प्राप्त कर सकते हैं 0

आमतौर पर आप उन सूचकांक, हालांकि की जरूरत नहीं है, लेकिन आप मुखौटा

mask = (min_value < a) & (a < max_value) 

यह मुखौटा a रूप में एक ही आकार के साथ एक बूलियन सरणी है के साथ अधिक कुशलता से काम कर सकते हैं।

संपादित: आप a रूप में एक ही आकार की एक सरणी b है, तो आप

b[mask] 
+0

बढ़िया! त्वरित उत्तर के लिए धन्यवाद। दरअसल, मास्क पर्याप्त है - लेकिन मैं इस मुखौटा को 'ए' के ​​समान आकार के किसी अन्य सरणी पर कैसे लागू करूं? – Katya

+0

@ कटिया इसका क्या अर्थ होगा? यदि आपके पास एक विशेष मास्क के साथ 5x5 सरणी थी, तो क्या आप परिभाषित कर सकते हैं कि 4x3 या 6x6 सरणी पर लागू करने का क्या अर्थ होगा? – Hooked

+0

@ कटिया: "इस मुखौटा को लागू करने" का क्या मतलब है? संबंधित तत्व निकालें? मैंने उस अंत में मेरे जवाब में एक वाक्य जोड़ा। –

4

आदेश numpy.where आप के बाद will return the indices of an array साथ mask में True प्रविष्टियों के लिए इसी b के तत्वों निकाल सकते हैं ' उन्होंने उन पर एक मुखौटा लगाया है। उदाहरण के लिए:

import numpy as np 
A = np.array([1,2,3,6,2]) 
np.where(A>2) 

देता है:

(array([2, 3]),) 

एक अधिक जटिल उदाहरण:

A = np.arange(27).reshape(3,3,3) 
np.where((A>10) & (A<15)) 

देता है:

(array([1, 1, 1, 1]), array([0, 1, 1, 1]), array([2, 0, 1, 2])) 

मैं, आम तौर पर आप @SvenMarnach से सहमत हूँ एन नहीं है सूचकांक सूचकांक।

+0

जब मैंने इसे देखा तो मैंने अभी 'मेरा' संस्करण बनाया था। आह। – senderle

+0

@ सेंसरल शायद यह धीमा भी है। हर बार मुझे लगता है कि मैं 'numpy/scipy' की पूरी शक्ति जानता हूं, यह साइट मुझे दिखाती है कि मैं गलत हूं। – Hooked

1

मुझे Sven का उत्तर बहुत पसंद है, और वास्तव में, numpy.where वही करता है जो आप चाहते हैं, क्योंकि हुक ने मुझे याद दिलाया। लेकिन अधिकतर क्योंकि मैंने इसे पहले से ही लिखा है, यहां कुछ और युक्तियों को चित्रित करने के लिए, एक और दृष्टिकोण है।

def my_filter(a): 
    return (10 < a) & (a < 40) 

a_mask = my_filter(a) 
indices = [ind[a_mask] for ind in numpy.indices(a.shape)] 

उदाहरण के लिए:: my_filter किसी भी इनपुट के रूप में ही आकार का एक बूलियन सरणी लौटने समारोह हो सकता है

>>> a = numpy.arange(100).reshape((10, 10)) 
>>> def my_filter(a): 
...  return (min_value < a) & (a < max_value) 
... 
>>> a_mask = my_filter(a) 
>>> [ind[a_mask] for ind in numpy.indices(a.shape)] 
[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
     3, 3, 3, 3, 3, 3]), 
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 
     4, 5, 6, 7, 8, 9])] 
4

नहीं सीधे आपके प्रश्न से संबंधित है, लेकिन filter() तीन का एक सेट का हिस्सा है कार्य, map(), filter(), और reduce(), जो पाइथन में कार्यात्मक-शैली सूची प्रसंस्करण की अनुमति देता है।

  • map(mapping_function, input_list) एक तर्क और एक सूची के एक समारोह में ले जाता है, बारी में सूची के प्रत्येक तत्व के लिए समारोह लागू होता है, और परिणाम के रूप में एक निर्गम सूची देता है। यह सूची समझ [mapping_function(item) for item in input_list] के बराबर या कम समकक्ष है।

  • filter(filter_function, input_list)input_list से तत्वों जिसके लिए filter_function लौटे True की एक सूची देता है। सूची समझ समकक्ष [item for item in items if filter_function(item)] है।

  • reduce(combining_function, input_list) बार-बार इनपुट सूची में तत्वों के आसन्न जोड़ों को जोड़ता है जब तक केवल एक मान शेष नहीं होता है। उदाहरण के लिए संख्याओं की एक सूची का योग reduce(operator.add, numbers) के रूप में व्यक्त किया जा सकता है।

map() और filter() की कार्यक्षमता अजगर में सूची comprehensions द्वारा प्रदान की जाती है (जिसके कारण map और filter कार्यों बहुत बार उपयोग नहीं किया जाता।)

reduce() उन चीजों जो नहीं करता है 'में से एक है टी खुद को एक सहज जवाब के रूप में सुझाव ... कुछ भी। लूप लिखना लगभग हमेशा स्पष्ट होता है, जो बताता है कि आप इसे अक्सर क्यों नहीं देखते हैं।

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