2015-11-26 4 views
5

scipy.signal से फ़ंक्शन argrelextrema फ्लैट extrema का पता नहीं लगाता है। उदाहरण:argrelextrema और फ्लैट extrema

import numpy as np 
from scipy.signal import argrelextrema 
data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) 
argrelextrema(data, np.greater) 
(array([2]),) 

पहले अधिकतम (2) का पता चला है, दूसरी अधिकतम (3, 3) का पता नहीं है।

इस व्यवहार के लिए कोई कामकाज? धन्यवाद।

उत्तर

12

लघु जवाब: शायद argrelextrema अपने कार्य के लिए इतनी छूट नहीं होगा। अपनी जरूरतों को पूरा करने के अपने स्वयं के कार्य लिखने पर विचार करें।


लंबे समय तक जवाब: आप argrelextrema उपयोग करने के लिए बाध्य कर रहे हैं? यदि हां, तो आप comparator और orderargrelextrema के तर्कों के साथ खेल सकते हैं (reference देखें)।

अपने आसान उदाहरण के लिए, np.greater_equalcomparator के रूप में चुनना पर्याप्त होगा।

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=1)) 
(array([2, 6, 7]),) 

नोट हालांकि इस तरह से

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 0 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=1)) 
(array([2, 6, 8]),) 

अलग ढंग से व्यवहार करती है कि कि आप शायद चाहते हैं, पहले 3 और 4 मॅक्सिमा के रूप में पाने के, के बाद से argrelextrema अब एक अधिकतम है कि अधिक से अधिक या है के रूप में सब कुछ देखता है अपने दो निकटतम पड़ोसियों के बराबर। अब आप order तर्क का उपयोग यह तय करने के लिए कर सकते हैं कि इस तुलना में कितने पड़ोसियों को पकड़ना चाहिए - order=2 चुनने से मेरा ऊपरी उदाहरण बदल जाएगा केवल अधिकतम 4 को।

>>> print(argrelextrema(data, np.greater_equal,order=2)) 
(array([2, 8]),) 

नहीं है, तथापि, यह करने के लिए एक नकारात्मक पक्ष यह है - चलो डेटा एक बार फिर बदलने के लिए:

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 5 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=2)) 
(array([ 2, 10]),) 

एक और शिखर के रूप में एक अंतिम मान 4 पर अपने शिखर खोजने से आप रहता है जोड़ा जा रहा है, के रूप में argrelextrema है अब 4 से अधिक दूसरा पड़ोसी देख रहा है (जो शोर डेटा के लिए उपयोगी हो सकता है, लेकिन सभी मामलों में अपेक्षित व्यवहार की आवश्यकता नहीं है)।


argrelextrema का उपयोग करना, आप हमेशा पड़ोसियों की एक निश्चित संख्या के बीच द्विआधारी संचालन तक ही सीमित रहेगा। नोट, हालांकि, सभी argrelextrema उपरोक्त आपके उदाहरण में कर रहे हैं n, data[n] > data[n-1] and data[n] > data[n+1] पर वापस लौटना है। आप इसे आसानी से कार्यान्वित कर सकते हैं, और फिर नियमों को परिशोधित कर सकते हैं, उदाहरण के लिए दूसरे पड़ोसी की जांच करके यदि पहले पड़ोसी के पास समान मूल्य है।


पूर्णता के लिए के लिए, वहाँ scipy.signal में एक अधिक विस्तृत समारोह, find_peaks_cwt हो रहा है। हालांकि मुझे इसका उपयोग करने का कोई अनुभव नहीं है और इसलिए आप इसके बारे में अधिक जानकारी नहीं दे सकते हैं।

+0

अन्य शीर्ष पहचान एल्गोरिदम के लिए, आप https: // github भी देख सकते हैं।com/monsieurV/py-findpeaks 'argrelextrema' वास्तव में आसान विकल्प नहीं है जब आप एल्गोरिदम व्यवहार के साथ टिंकर करना चाहते हैं। –

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