[SciPy-user] calculate average by excluding NaN value in Array
Chris Barker
Chris.Barker@noaa....
Mon Mar 30 08:21:23 CDT 2009
David Cournapeau wrote:
>> nanmean should do what you want,
Actually, I don't think that's what the OP wanted:
>>>> a=array([2.,3,4,5])
>>>> b=([3.,2,4, NaN])
>>>> average(array([a,b],"f"),axis=0)
> array([ 2.5, 2.5, 4. , NaN], dtype=float32)
>>>>
> I mean that I need is [2.5,2.5,4,5], instead.
In this case, numpy really is doing the only correct thing, in an
operation like this, the result should be the same size as the input
arrays, and the average of NaN and anything else can only be NaN.
Imagine there were more than on NaN in the inputs -- how would you eve
know which values in the resulting array belonged to which inputs? So
you should probably check for NaN afterwards, and then do what you need
with them:
>>> import numpy as np
>>> a=np.array([2.,3,4,5])
>>> b=np.array([3.,2,4, np.NaN])
>>> avg = np.average(np.array([a,b],dtype = np.float),axis=0)
>>> avg
array([ 2.5, 2.5, 4. , NaN])
>>> # now check for NaN:
>>> np.isfinite(avg)
array([ True, True, True, False], dtype=bool)
>>> # or
>>> np.isnan(avg)
array([False, False, False, True], dtype=bool)
>>> # get a version without the non-finite numbers:
>>> avg[np.isfinite(avg)]
array([ 2.5, 2.5, 4. ])
So I think what you want is to strip the NaNs out later:
More information about the SciPy-user
mailing list