2012-10-31 46 views
7

का उपयोग कर रैखिक इंटरपोलेशन मेरे पास 1 आयामी सरणी है जो फ्लोट्स की अधिकतर है लेकिन कुछ मान गुम हैं। गुम डेटा नैन (संख्या नहीं) के साथ प्रतिस्थापित है। मुझे आस-पास के अच्छे मूल्यों से रैखिक इंटरपोलेशन द्वारा सरणी में लापता मानों को प्रतिस्थापित करना होगा। तो, उदाहरण के लिए:numpy.interp

F7(np.array([10.,20.,nan,40.,50.,nan,30.])) 

np.array([10.,20.,30.,40.,50.,40.,30.]). 

क्या इस अजगर का उपयोग कर ऐसा करने का तरीका सबसे अच्छा है लौट जाना चाहिए?

किसी भी मदद की बहुत सराहना जाएगा

धन्यवाद

scipy.interpolate.interp1d
+3

तुम सच में रैखिक प्रक्षेप मतलब है? या आप वास्तव में औसत मतलब है? - मुझे यह भी लगता है कि पहले और आखिरी मूल्यों की गारंटी NaN नहीं है? – mgilson

+0

यह उदाहरण पर सिर्फ एक औसत था। रैखिक इंटरपोलेशन वास्तव में एक रैखिक समीकरण में लापता मूल्यों को ढूंढना चाहिए। और हाँ, पहले और आखिरी मूल्य NaN नहीं हैं। –

उत्तर

11

आप इस्तेमाल कर सकते हैं:

>>> from scipy.interpolate import interp1d 
>>> import numpy as np 
>>> x = np.array([10., 20., np.nan, 40., 50., np.nan, 30.]) 
>>> not_nan = np.logical_not(np.isnan(x)) 
>>> indices = np.arange(len(x)) 
>>> interp = interp1d(indices[not_nan], x[not_nan]) 
>>> interp(indices) 
array([ 10., 20., 30., 40., 50., 40., 30.]) 

संपादित: यह मुझे कुछ समय लिया कैसे np.interp काम करता है यह पता लगाने की है, लेकिन यह कर सकते हैं नौकरी भी करें:

>>> np.interp(indices, indices[not_nan], x[not_nan]) 
array([ 10., 20., 30., 40., 50., 40., 30.]) 
+1

मुझे लगता है कि मैं '* x.shape' की बजाय' len (x) 'का उपयोग करूंगा। ऐसा लगता है कि हम केवल 1 डी कर रहे हैं (और यह अधिक आयामों के लिए सामान्य नहीं है) - लेकिन एक काम कर रहे इंटरपोलेट समाधान के लिए +1। – mgilson

+0

'np.arange (लेन (x)) को दो बार उत्पन्न करने के बजाय, क्यों न केवल इसे एक बार करें और परिणाम संग्रहित करें? इसके अलावा, मुझे नहीं लगता कि आपको इसके लिए 'scipy' की आवश्यकता है। 'np.interp' ऐसा लगता है कि यह इस परिदृश्य में एक ही चीज़ करेगा – mgilson

+0

@mgilson: आप सही तीन बार थे। धन्यवाद, उत्तर अद्यतन किया। –

6

मैं pandas के साथ जाऊंगा। एक oneliner के साथ एक minimalistic दृष्टिकोण:

from pandas import * 
a=np.array([10.,20.,nan,40.,50.,nan,30.]) 
Series(a).interpolate() 

Out[219]: 
0 10 
1 20 
2 30 
3 40 
4 50 
5 40 
6 30 

या आप एक सरणी के रूप में रखना चाहते हैं:

Series(a).interpolate().values 

Out[221]: 
array([ 10., 20., 30., 40., 50., 40., 30.]) 
+0

@ लार्समैन - मैं बस सुझाव देने जा रहा था। मूल्य, जो एक सरणी भी देता है :) – root

+0

देखा, मेरी टिप्पणी हटा दी। पांडा अभी भी "सीखने के लिए पुस्तकालय" सूची पर है :) –