Re: Question: Ignore Index

From: Dennis Shea (shea AT cgd.ucar.edu)
Date: Fri Feb 11 2005 - 07:46:56 MST

  • Next message: Mary Haley: "NCL binaries moved to new location"

    >I am having problems with the ability to neglect values at a particular
    >index. I have a 1-D array containing 20 values. If any index (i) of that
    >array corresponds to a missing/fill value (-999), I do not want to use that
    >index in furture calculations. Any thoughts on how this may be accomplished?
    >Below is a subsection of my script. Thanks!

    Yes the "ind" and "ismissing" functions can readily be used.

       http://ngwww.ucar.edu/ngdoc/ng/ref/ncl/functions/ind.html
       http://ngwww.ucar.edu/ngdoc/ng/ref/ncl/functions/ismissing.html
       
    Let x be a 1D array

       ii = ind(.not.ismissing(x)) ; subscripts where x.ne.x@_FillValue
       

    >
    >
    > angle = new((/20/),float)
    > azAngle = new((/20/),float)
    > vel_circle = new((/20/),float)
    > alpha = new((/20/),float)
    > aVec = new((/20/),float)
    > bVec = new((/20/),float)
    > cVec = new((/20/),float)
    > aVecSq = new((/20/),float)
    > bVecSq = new((/20/),float)
    >
    > vel_circle@_FillValue = -999

    When using "new", a default _FillValue is assigned if one
    is not explicitly provided via the optional 3rd argument.
    For type float, the default is -999.

    >
    > do i=0,19
    >
    > angle(i) = (2*3.14*(i))/20
    > rr(i) = dim_rMid+RR*sin(angle(i))
    > az(i) = dim_azMid+RAZ*cos(angle(i))
    >
    > azAngle(i) = az(floattoint(az(i)))
    > azAngle(i) = azAngle(i)*(3.14/180)
    >
    > vel_circle(i) = vel(floattoint(az(i)),floattoint(rr(i)))*.01
    >
    > if (vel_circle(i).neq.-999) then
    >
    > aVec(i) = sin(angle(i)-azAngle(i))
    > bVec(i) = cos(angle(i)-azAngle(i))
    > cVec(i) = vel_circle(i)-15*cos(1.4-azAngle(i))
    >
    > aVecSq(i) = (aVec(i))^2
    > bVecSq(i) = (bVec(i))^2
    >
    > end if
    >
    > end do
    >

    [1] Use array syntax, operations and built-in functions.
        This results in *much* faster code. This pertains to
        *any* interpreted language ... eg NCL, matlab, IDL
        
        N = 20
        pi = 4.*atan(1.)
        rad = pi/180.
        
        angle = 2.*ispan(0,N-1,1)/pi
        rr = dim_rMid+RR*sin(angle)
        az = dim_azMid+RAZ*cos(angle)

        azAngle = az(floattoint(az))
        azAngle = azAngle*rad

        vel_circle = vel(floattoint(az),floattoint(rr))*.01
        vel_circle@_FillValue = -999.
                       ; maybe better
                       ; imsg = ind(vel_circle.lt.-900)
                       ; vel_circle(imsg) = -999.
                       ; vel_circle@_FillValue = -999.
        ii = ind(.not.ismissing(val_circle)) ; indices with valid values

        aVec(ii) = sin(angle(ii)-azAngle(ii))
        bVec(ii) = cos(angle(ii)-azAngle(ii))
        cVec(ii) = vel_circle(ii)-15*cos(1.4-azAngle(ii))

        aVecSq(ii) = (aVec(ii))^2
        bVecSq(ii) = (bVec(ii))^2
        

    ---
    Tip: Learn to use ind and the ndtooned and onedtond functions.
    

    good luck D

    _______________________________________________ ncl-talk mailing list ncl-talk@ucar.edu http://mailman.ucar.edu/mailman/listinfo/ncl-talk



    This archive was generated by hypermail 2b29 : Fri Feb 11 2005 - 09:18:18 MST