Re: ListInterpolate and missing values
- To: mathgroup at smc.vnet.net
- Subject: [mg124867] Re: ListInterpolate and missing values
- From: Ulrich Arndt <ulrich.arndt at data2knowledge.de>
- Date: Fri, 10 Feb 2012 05:52:13 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201202091034.FAA18221@smc.vnet.net>
Hi, I didn't checked the ListInterpolate as it was not obvious to me how this can help. Maybe below function will do sufficient enough - test case of 1 mio element list in < 2 sec. I added a constrained to the function that the first and the last element should not be null as no rule was given for this case... Ulrich x={1,2,10,,12,2,6,6,,,,12,22}; Clear[specialInterpole]; = specialInterpole[x_List/;NumericQ[x[[1]]]==True&&NumericQ[x[[-1]]]== True]:= Module[{out,p,t,vals,diff,len,increment,newvals}, p = Position[x,Null]//Flatten; t = Split[p,#2==#1+1&]; If[Length[p]>0, vals = Map[{x[[Min[#]-1]],x[[Max[#]+1]]}&,t]; diff = Map[#[[2]]-#[[1]]&,vals]; len = Map[Length,t]; increment = Map[#[[1]]/#[[2]]&,Transpose[{diff,len+1}]]; newvals = vals[[All,1]]+Map[Range,len] * increment; out = x; out[[Flatten[t]]]=Flatten[newvals]; ]; out]; specialInterpole[x] Out[156]= {1,2,10,11,12,2,6,6,15/2,9,21/2,12,22} specialInterpole[{1,,,,,,,,,10}] Out[157]= {1,2,3,4,5,6,7,8,9,10} specialInterpole[{,1,2}] Out[158]= specialInterpole[{Null,1,2}] specialInterpole[{1,1,}] Out[159]= specialInterpole[{1,1,Null}] specialInterpole[{1,,1}] Out[160]= {1,1,1} SeedRandom[1] dim = 1000000 dat =Range[dim]; dat[[RandomSample[dat,dim/10]]]= ConstantArray[Null,dim/10]; dat[[1;;20]] dat[[-1]] Out[395]= 1000000 Out[398]= = {1,Null,3,4,5,6,7,8,Null,Null,11,12,13,Null,Null,16,17,18,19,20} Out[399]= 1000000 Timing[out = specialInterpole[dat];] Out[400]= {1.49907,Null} out==Range[dim] Out[401]= True -- www.data2knowledge.de Am 09.02.2012 um 11:34 schrieb Mark Coleman: > Hi, > > I'm looking for a way to linearly interpolate missing values in a > large list of numbers such that the interpolated values reflect the > size of the "gap" between non-missing values. For instance, say I have > the following list: > > x={1,2,10,,12,2,6,6,,,12,22} > > The list x has two gaps. A gap of size "1" at x[4], and a gap a size > "2" at x[10]-x[11]. I'm looking for a linear interpolation method such > that > > x[4] = 11, > > x[10]=8, x[11]=10 > > That is, each of the interpolated values is a constant increment > between the two surrouding non-missing values. My actually problem has > millions of such lists, where gaps are dispersed randomly (In thinking > about his more, missing endpoints could also be interpolated by > "extending" the line between the two succeeeding or preceeding > points). > > I'm wondering if ListInterpolate can handle this sort of problem > directly? If not, any help would be much appreciated. > > Cheers, > > Mark >
- References:
- ListInterpolate and missing values
- From: Mark Coleman <markspcoleman@gmail.com>
- ListInterpolate and missing values