2012-09-02 8 views
6

numpy.interp बहुत सुविधाजनक और अपेक्षाकृत तेज़ है। कुछ संदर्भों में मैं अपने आउटपुट की तुलना गैर-इंटरपोलेटेड वेरिएंट के विरुद्ध करना चाहता हूं जहां स्पैस मान प्रचारित होते हैं ("डेंसर" आउटपुट में) और परिणाम स्पैस इनपुट के बीच टुकड़े की स्थिरता होती है। जो फ़ंक्शन मैं चाहता हूं उसे "स्पैस -> घने" कनवर्टर भी कहा जा सकता है जो नवीनतम स्पैस मूल्य की प्रतिलिपि बनाता है जब तक कि उसे बाद का मूल्य न मिले (एक प्रकार का शून्य इंटरपोलेशन जैसे कि शून्य समय/दूरी पहले के मान से कभी समाप्त हो गई हो)।अगर मैं शून्य इंटरपोलेशन (टुकड़े की स्थिरता) चाहता हूं तो numpy.interp के लिए सबसे अच्छा ड्रॉप-इन प्रतिस्थापन क्या है?

दुर्भाग्यवश, numpy.interp के लिए स्रोत को ट्विक करना आसान नहीं है क्योंकि यह केवल संकलित फ़ंक्शन के आसपास एक रैपर है। मैं इसे पाइथन लूप का उपयोग करके खुद लिख सकता हूं, लेकिन समस्या को हल करने के लिए सी-स्पीड तरीका ढूंढने की उम्मीद है।

अद्यतन: नीचे (kind='zero' साथ scipy.interpolate.interp1d) समाधान काफी धीमी है और (लंबाई कि 50% आबादी वाले है में जैसे इनपुट 500k) प्रति कॉल 10 सेकंड से अधिक लेता है। यह शून्य-ऑर्डर स्पलाइन का उपयोग करके kind='zero' लागू करता है और spleval पर कॉल बहुत धीमी है। हालांकि, kind='linear' (यानी डिफ़ॉल्ट इंटरपोलेशन) के लिए स्रोत कोड सीधे numpy का उपयोग कर समस्या को हल करने के लिए एक उत्कृष्ट टेम्पलेट देता है (न्यूनतम परिवर्तन slope=0 सेट करना है)। वह कोड दिखाता है कि समस्या को हल करने के लिए numpy.searchsorted का उपयोग कैसे करें और रनटाइम numpy.interp पर कॉल करने के समान है, इसलिए समस्या को हल करने के लिए scipy.interpolate.interp1d रैखिक इंटरपोलेशन के कार्यान्वयन को हल करके हल किया जाता है (ढलान! = 0 आसन्न मूल्यों को मिश्रित करता है)।

+0

बस अपडेट के लिए धन्यवाद कहना चाहता था - मैं 'spyy' के लिए पूरी निर्भरता के बिना' numpy' के साथ एक शून्य इंटरपोलेशन चाहता था, और आपके पोस्ट अपडेट ने इसे करने का तरीका बताया। मैंने एक छोटे से परीक्षण में किया है, 'numpy' 1.5.1: '_fitpack.so' के साथ 0.8.0' scipy' स्थापित किया है मेरा परीक्षण 308 से 508 μs में करता है; जबकि 'numpy'- केवल 'slope = 0' के साथ हैक किया गया रैखिक 491 से 778 μs में समान होता है - इसलिए मेरे लिए यह धीमा है; लेकिन इतना नहीं! धन्यवाद फिर से - चीयर्स! – sdaau

उत्तर

3

scipy.interpolate.interp1d सभी प्रकार के इंटरपोलेशन कर सकते हैं: 'रैखिक', 'निकटतम', 'शून्य', 'slinear', 'quadratic,' cubic '।

दस्तावेज़ की जांच करें: http://docs.scipy.org/doc/scipy-0.10.1/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d

+0

धन्यवाद, दयालु = 'शून्य' मेरी समस्या हल करती है। –

+1

दुर्भाग्य से यह प्रश्न के प्रति अद्यतन बहुत धीमा है। यह एक पूरी तरह से वैध उत्तर है लेकिन अंतर्निहित स्पलीन कार्यान्वयन बहुत ही कुशल नहीं है। –

0

बस पूरा करने के लिए:

def interpolate_constant(x, xp, yp): 
    indices = np.searchsorted(xp, x, side='right') 
    y = np.concatenate(([0], yp)) 
    return y[indices] 
: प्रश्न का हल निम्नलिखित कोड जो मैं अद्यतन जवाब में दी गई संकेत की मदद से लिखने में सक्षम था
0

मैं पूरी तरह से सहमत हूं कि दयालु = 'शून्य' बेहद धीमी है; लाखों पंक्तियों के बड़े डेटा सेट के लिए यह सचमुच 'रैखिक' विधि से 1000 गुना धीमा हो सकता है। नवीनतम मूल्य का उपयोग कर - - "बाएं निरंतर" प्रक्षेप के लिए निम्नलिखित कोड काम करता है:

def approx(x, y, xout, yleft=np.nan, yright=np.nan): 
    xoutIdx  = np.searchsorted(x, xout, side='right')-1 
    return (np.where(xout<x[0], yleft, np.where(xout>x[-1], yright, y[xoutIdx]))) 

आर पृष्ठभूमि से आ रहा है, इस च = 0 के साथ आर के लगभग बराबर है। मुझे "दाएं-निरंतर" इंटरपोलेशन के लिए ऐसा करने का एक साफ तरीका नहीं मिला है क्योंकि पाइथन की np.searchsorted side = 'right' के साथ एक इंडेक्स वापस धक्का देता है यदि xout मान x में मान के साथ बिल्कुल मेल खाता है ...

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

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