[ncl-talk] "sum" and "avg" functions without ignoring missing values

Dave Allured - NOAA Affiliate dave.allured at noaa.gov
Fri Nov 24 12:46:50 MST 2017


Rasheed,

I think dim_cumsum and dim_cumsum_n with opt=0 are intended for this
purpose.  There is no corresponding function for "avg".  However, simply
dividing the result array from dim_cumsum by N should give the correct
array result, with no extra "if" or "where" statement.

--Dave


On Fri, Nov 24, 2017 at 12:29 PM, Rashed Mahmood <rashidcomsis at gmail.com>
wrote:

> Hi Arne,
>
> Thanks for trying to answer the question, however, the things you
> mentioned would add confusion and possibly wrong results.
> Actually I know how to achieve what I want using a do loop. For example,
> let us say we have variable a = (ntimes,nlevel,nlat,nlon) and we want to do
> sum over time domain which can easily be done using: (dim_sum_n(a,0)), Now
> the results would be sum over all non-missing values of
> time1,time2,time2...timeN, which is correct.
>
> But if I want to do sum ONLY when all of the values of
> time1,time2,time3...timeN are non-missing then we can do this:
>
>  dimz = dimsizes(a)
>  b      = new(/dimz(1),dimz(2),dimz(3),float)
>  b at _FillValue = a at _FillValue
>
>   b(:,:,:) = 0.
>   do n=0,dimz(0)-1
>        b = b+a(n,:,:,:)
>   end do
>
> I just wanted to avoid the loop and use the "sum" function for efficiency.
> I hope this clarifies the question a bit more.
>
> Cheers,
> Rashed
>
>
> On Fri, Nov 24, 2017 at 3:01 AM, Arne Melsom <arne.melsom at met.no> wrote:
>
>> Hi!
>> Since 'music piano' replied, I thought I might chime in ;)
>> I'm pretty sure that no option(s) to functions allow you to do what you
>> want.
>> So you'll need to write alternative functions yourself (perhaps not what
>> you consider 'an easy way'...)
>> You may use something like
>>
>> aDim = dimsizes(a)
>> orgFill = a at _FillValue
>> newFill = -min(abs(a)) - 1    ; make sure newFill is out of range and <0
>> if (newFill .eq. orgFill) then  ; newFill must be different from orgFill
>>   newFill = newFill - 1
>> end if
>> newVar = ndtooned(a)
>> newVar at _FillValue = newFill
>> indx = ind(ismissing(newVar))
>> newVar(indx) = orgFill
>> newa = onedtond(newVar,aDim)
>>
>> ...and, if you later want to restore:
>> a = newa
>> a at _FillValue = orgFill
>>
>> Hope this helps/clarifies!
>> Best regards,
>> Arne
>>
>>
>> 2017-11-24 1:49 GMT+01:00 Rashed Mahmood <rashidcomsis at gmail.com>:
>>
>>> Hello all,
>>> I am just wondering if there is an easy way to tell the "sum" and "avg"
>>> functions NOT ignore the missing values. Below lines clarify my question
>>> where I would like to see same values for c and d:
>>>
>>> ncl 0> a = (/(/-9.,2,-9./),(/1,-9.,2./)/)
>>> ncl 1> a at _FillValue = -9.
>>> ncl 2> c = (a(0,:)+a(1,:))
>>> ncl 3> d = dim_sum_n(a,0)
>>> ncl 4> print("  "+c+ " ... "+d)
>>> (0)       -9 ... 1
>>> (1)       -9 ... 2
>>> (2)       -9 ... 2
>>>
>>> Thanks,
>>> Rashed
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20171124/54bdcb5b/attachment.html>


More information about the ncl-talk mailing list