Example #1
0
    def _subSampleByAveraging(self, var, timeVar, flagVar, samplingRate, flagsToUse):
        """
        Returns a new variable which is 'var' sub-sampled by averaging
        at the given samplingRate with data selected according to flagVar
        including the flag values specified in flagsToUse (defaults are 0 and 1).
        """
        maskedArray=self._getMaskedArray(var, flagVar, flagsToUse)
        shape=var.shape
        if shape[1]==1:
            newNumArray=MV.ravel(maskedArray)
            newArrayMask=MV.ravel(maskedArray.mask())
            newArray=MA.masked_array(newNumArray, mask=newArrayMask, fill_value=maskedArray.fill_value())
        else:
            newArray=Numeric.zeros(shape[0], 'f')
            for t0 in range(shape[0]):
                # Set as missing if less than half are valid                 
                t1Array=maskedArray[t0]

                if samplingRate==1:
                    # If half or more are good values then calculate the mean
                    if t1Array.count()>=(shape[1]/2.):
                        newArray[t0]=MA.average(t1Array)
                    # otherwise set as missing value
                    else:
                        newArray[t0]=maskedArray.fill_value()
        
                else:
                    raise "Averaging for non 1Hz sampling rates not yet supported!"

        # Now re-construct variable axes etc
        newTimeAxis=self._flatten2DTimeAxis(timeVar, samplingRate)
        newVar=self._recreateVariable(var, newArray, newTimeAxis, flagVar, max(flagsToUse), missingValue=maskedArray.fill_value(), sampleBy="averaging") 
        return newVar
Example #2
0
    def _subSampleByAveraging(self, var, timeVar, flagVar, samplingRate, flagsToUse):
        """
        Returns a new variable which is 'var' sub-sampled by averaging
        at the given samplingRate with data selected according to flagVar
        including the flag values specified in flagsToUse (defaults are 0 and 1).
        """
        maskedArray = self._getMaskedArray(var, flagVar, flagsToUse)
        shape = var.shape
        if shape[1] == 1:
            newNumArray = MV.ravel(maskedArray)
            newArrayMask = MV.ravel(maskedArray.mask())
            newArray = MA.masked_array(newNumArray, mask=newArrayMask, fill_value=maskedArray.fill_value())
        else:
            newArray = Numeric.zeros(shape[0], "f")
            for t0 in range(shape[0]):
                # Set as missing if less than half are valid
                t1Array = maskedArray[t0]

                if samplingRate == 1:
                    # If half or more are good values then calculate the mean
                    if t1Array.count() >= (shape[1] / 2.0):
                        newArray[t0] = MA.average(t1Array)
                    # otherwise set as missing value
                    else:
                        newArray[t0] = maskedArray.fill_value()

                else:
                    raise "Averaging for non 1Hz sampling rates not yet supported!"

        # Now re-construct variable axes etc
        newTimeAxis = self._flatten2DTimeAxis(timeVar, samplingRate)
        newVar = self._recreateVariable(
            var,
            newArray,
            newTimeAxis,
            flagVar,
            max(flagsToUse),
            missingValue=maskedArray.fill_value(),
            sampleBy="averaging",
        )
        return newVar
Example #3
0
def processRainfall(file, outdir, var, north, west, south, east):
    "Subsets, averages, writes to binary files."
    f=cdms.open(file)
    v=f(var, lat=(south, north), lon=(west, east))
    timevalues=v.getTime()[:]
    t0=timevalues[0]
    # I need to test if step 0 always has only missing values
    # remove -50 values???
    v=MA.masked_less(v,0)
    # create average of all ensemble members
    av=MA.average(v, axis=1)

    # get stuff for name
    datetime=os.path.split(file)[-1].split(".")[1]

    outpaths=[]

    # now step through time dimension (0)
    count=0
    for dslice in av:
        ts=timevalues[count]-t0
        outfile="rainfall.%s.%dh.dat" % (datetime, ts)
        outpath=os.path.join(outdir, outfile)
        count=count+1
        numarray=Numeric.array(dslice._data)
        sh=numarray.shape
        length=sh[0]*sh[1]
        flatarray=Numeric.resize(numarray, [length])
        output=open(outpath, "wb")
        arr=array.array('f', flatarray)
        arr.tofile(output)
        output.close()
        print "Written:", outpath
        outpaths.append(outpath)

    return outpaths
Example #4
0
# How to use numpy with 'None' value in Python?
import MA
a = MA.array([1, 2, None], mask = [0, 0, 1])
print "average =", MA.average(a)
Example #5
0
File: ngl09p.py Project: akrherz/me
hlat = ice1.variables["hlat"]  # hlat[49]
hlon = ice1.variables["hlon"]  # hlon[100]


dimf     = fice.shape  # Define an array to hold long-term monthly means.
ntime    = fice.shape[0]
nhlat    = fice.shape[1]
nhlon    = fice.shape[2]

nmo    = 0
month  = nmo+1

icemon = MA.zeros((nhlat,nhlon),MA.Float0)
for i in xrange(fice_masked.shape[0]):
  for j in xrange(fice_masked.shape[1]):
    icemon[i,j] = MA.average(fice_masked[i,j,0:ntime:12])

#
#  Fill the places where icemon is zero with the fill value.
#
icemon = MA.masked_values(icemon,0.,rtol=0.,atol=1.e-15)
icemon = MA.filled(icemon,value=fill_value)

                       # Calculate the January (nmo=0) average.


nsub = 16 # Subscript location of northernmost hlat to be plotted.

cmap = Numeric.array([                                         \
         [1.00,1.00,1.00], [0.00,0.00,0.00], [1.00,1.00,0.50], \
         [0.00,0.00,0.50], [0.50,1.00,1.00], [0.50,0.00,0.00], \
Example #6
0
from soomarray import ArrayDict

ad = ArrayDict('blah.dat', 'r+')
a = Numeric.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], Numeric.Int)
m = Numeric.array([0, 0, 0, 0, 0, 1, 0, 0, 1, 0], Numeric.Int)
ad['matest1'] = MA.array(a, mask=m)
del ad

ad = ArrayDict('blah.dat')
matest = ad['matest1']

print "matest: ", matest
print "sum of matest: ", MA.sum(matest)
print "length of matest: ", len(matest)
print "count of matest: ", MA.count(matest)
print "average of matest: ", MA.average(matest)
print "minimum of matest: ", MA.minimum(matest)
print "maximum of matest: ", MA.maximum(matest)

del ad

ad = ArrayDict('blah.dat', 'w')

a = Numeric.array(xrange(1000), Numeric.Int)
m = Numeric.array(Numeric.repeat(Numeric.array([0, 1], Numeric.Int), 500),
                  Numeric.Int)
ad['matest2'] = MA.array(a, mask=m)

m = Numeric.array(Numeric.repeat(Numeric.array([1, 0], Numeric.Int), 500),
                  Numeric.Int)
ad['matest3'] = MA.array(a, mask=m)
Example #7
0
  def get_ascii_xy(self,rq,variable=None, mime='html'):

    html = 'trying <br/>'
    if not self.check_open():
        return (1, 'failed to open file','   ','could not open %s<br/>' % self.ddd.this_file)

    pmess = ' xxx  '
    try:
      nc = self.nc
      vk = nc.variables.keys()
      html += '%s <br/>' % str( vk )
      nsn = 0
      
      for vv in vk:
           if len( nc.variables[vv].shape ) == 3:
             html += '%s <br/>' % str(nc.variables[vv].attributes.keys())
             standard_name = nc.variables[vv].attributes.get('standard_name', nc.variables[vv].attributes['name'] )
             v = vv

             nsn += 1
      if nsn != 1:
        if nsn > 1:
          return (0,' ', ' ','more than one named rank 3 variable in file')
        else:
          return (0,' ', ' ','no named rank 3 variable in file')
    except:
      return (1, 'failed to identify variable','   ',html)

    self.variable_name = v

    if  nc.variables[v].attributes.has_key('standard_name'):
      self.standard_name = standard_name
    else:
      self.standard_name = None

    if mime == 'csv':
      self.make_csv_header()

    try:
      html += '%s<br/>' % standard_name
      var = nc.variables[v]
      data = nc.variables[v].getValue()
      Axes = nc.variables[v].getAxisList()
      fmt = fmts.get( v, '%s' )
      tAx = nc.getAxis( 'time' )
      yAx = nc.getAxis( 'latitude' )
      xAx = nc.getAxis( 'longitude' )
      yAxes = yAx.getValue()
      xAxes = xAx.getValue()

      if rq.fields.has_key( 'forwardbutton' ):
        lat0 = iget( rq, 'startY', 0 )
        lat9 = iget( rq, 'endY', min(len(yAxes)-1,5) )
        lon0 = iget( rq, 'startX', 0 )
        lon9 = iget( rq, 'endX', min(len(xAxes)-1,5) )
        xtarg0 = xAxes[lon0]
        xtarg9 = xAxes[lon9]
        ytarg0 = yAxes[lat0]
        ytarg9 = yAxes[lat9]
      else:
        ytarg0, lat0 = ccget( rq, 'YY0', '0.00', yAxes )
        ytarg9, lat9 = ccget( rq, 'YY9', '30.00', yAxes )
        xtarg0, lon0 = ccget( rq, 'XX0', '0.00', xAxes )
        xtarg9, lon9 = ccget( rq, 'XX9', '30.00', xAxes )

      ##if ix > len( xAxes ) -1:
        ##ix = len( xAxes ) -1
      ##if iy > len( yAxes ) -1:
        ##iy = len( yAxes ) -1

      html += 'zz'
      startYear, startMonth, startDay, endYear = utils.cf_time_info( nc, tAx, bounds='clim_bounds' )
      trange = '%s-%s' % (startYear, endYear )
      self.time_info = (startYear, startMonth, startDay, endYear)

      kt=0
      km=0
      plot_mean = False
      try:
        if rq.fields.has_key( 'monthSeason'):
          msv = '??'
          try:
            msv = rq.fields['monthSeason'].value
            if msv in ['djf','mam','jja','son','annual']:
              plot_mean = True
            else:
              plot_mean = False
              km = int(msv) - 1
          except:
            msv = '???'
        else:
          msv = 'unset'
      except:
        msv = 'could not set'

      if msv == 'unset':
        cmsv = 'Jan'
      elif plot_mean:
        cmsv = msv
      else:
        cmsv = mnths[km]
      html += 'msv = %s<br/>' % str(msv)
      sel = { True:' selected="selected"', False:'' }
      sel2 = { True:' disabled="disabled"', False:'' }

      if mime == 'csv':
        self.csv_header_append( 'Attribute','g','Time period in year', cmsv )
        self.csv_header_append( 'Attribute','g','Start year', startYear )
        self.csv_header_append( 'Attribute','g','End year', endYear )
      
      il = range(len(yAxes))
      if yAxes[-1] > yAxes[0]:
          il.reverse()
      displayModes = ''
      dm2 = '<center>Select display mode:<br/>'
      if mime == 'html':
        try:
          dm = ['xy','ts']
          dmn = ['Latitude-Longitude grid','Time series at a point']
          for k in range(len(dm)):
            displayModes +=    \
              '<option value="%s"%s>%s</option>\n' % (k+1,sel[k==0],dmn[k])
            dm2 += '<input type="submit"%s name="*%s" value="%s"/><br/>\n' % (sel2[k==0],dm[k],dmn[k])
        except:
          displayModes = 'zzzzzzzzzzzzzzzzzzzz'
        dm2 += "</center>"

        time_options = ' '
        for k in range(12):
          time_options += '<option value="%s"%s>%s</option>\n' % (k+1,sel[km==k],mnths[k])
        for k in range(len(seas)):
          time_options += '<option value="%s"%s>%s</option>\n' % (seas[k],sel[msv==seas[k]],seas[k])

        start_y_options =' '
        end_y_options =' '
        end_y_label = 'Upper Latitude'
        start_y_label = 'Lower Latitude'

        for k in il:
          start_y_options +=    \
            '<option value="%s"%s>%6.2f</option>\n' % (k+1,sel[k==lat0],yAxes[k])
          end_y_options +=    \
            '<option value="%s"%s>%6.2f</option>\n' % (k+1,sel[k==lat9],yAxes[k])

        end_x_label = 'Upper Longitude'
        start_x_label = 'Lower Longitude'
        start_x_options =' '
        end_x_options =' '
        for k in range(len(xAxes)):
          start_x_options +=    \
            '<option value="%s"%s>%6.2f</option>\n' % (k+1,sel[k==lon0],xAxes[k])
          end_x_options +=    \
            '<option value="%s"%s>%6.2f</option>\n' % (k+1,sel[k==lon9],xAxes[k])

      yname = axname( yAx, 'Y' )
      xname = axname( xAx, 'X' )
      if mime == 'csv':
        self.csv_header_append( 'Comment','First column',yname, ' ' )
        self.csv_header_append( 'Comment','First row',xname, ' ' )

      html += 'axes: %s, %s<br/>' % (xname,yname)
      s = data.shape
      sl = [0,0,0]
      islt = Axes.index( tAx )
      isly = Axes.index( yAx )
      islx = Axes.index( xAx )

      if lat0 > lat9:
          yslice = slice( lat9, lat0+1 )
      else:
          yslice = slice( lat0, lat9+1 )

      sl[islt] = km
      sl[isly] = yslice
      sl[islx] = slice( lon0, lon9+1 )

      if standard_name in ['precipitation_flux_anomaly','precipitation_flux']:
        units = 'mm/day'
        factor = 3600*24
      elif standard_name in ['precipitation_amount']:
        units = 'mm/month'
        factor = 1
      else:
        factor = 1
        units = var.attributes['units']
        if standard_name == 'air_temperature' and units == 'hPa':
          units = 'Celsius'

      if variable in utils.cru_vdict.keys():
          display_name = utils.cru_vdict[variable]
      elif variable in utils.tar_vdict.keys():
          display_name = utils.tar_vdict[variable]
      else:
          display_name = standard_name

      title = '%s [%s], %s' % (display_name,units,cmsv)
      html += '<br/>xxx'
      html += '<br/>' + str(sl)
      html += '<br/>' + str(data[sl].shape)
      html += '<br/>' + xname
      html += '<br/>' + yname
      html += '<br/>' + str(xAxes[lon0:lon9+1])
      html += '<br/>' + str(plot_mean)
      if not plot_mean:
        data_display = slice2table( title, xname, xAxes[lon0:lon9+1], yname, yAxes[yslice], data[sl], isly > islx, fmt, factor, mime=mime )
      else:
        html += '<br/>' + str(msv)
        t =  { 'annual':(0,12), 'mam':(2,5), 'jja':(5,8),'son':(8,11),'djf':[(11,12),(0,2)] }[msv]
        html += '<br/> time slice: ' + str(t)
        pmess += '<br/> %s <br/>' % str(t)
        pmess += '%s<br/>\n' % str( type )
        pmess += '%s<br/>\n' % str(  t[0] )
        try:
          import Numeric
          import MA as thisMa
        except:
          import numpy
          import numpy.ma as thisMa
        if type( t[0] ) == type(0):
          sl[islt] = slice( t[0],t[1] )
          html += '<br/>' + str(sl)
          html += '<br/> data shape:: ' + str(data.shape)
          pmess += 'zzzz<br/>\n' 
          vv = thisMa.masked_outside( data[sl].tolist(), -990., 900. )
          v = thisMa.average( vv, axis=islt )
          v = thisMa.masked_values( v, -999. )
        else:
          sl1 = sl[:]
          sl[islt] = slice(t[0][0],t[0][1])
          sl1[islt] = slice(t[1][0],t[1][1])
          pmess += 'qqqq<br/>\n' 
          vv = thisMa.masked_outside( data[sl].tolist(), -990., 900. )
          vv1 = thisMa.masked_outside( data[sl1].tolist(), -990., 900. )
          pmess += 'qqqq<br/>\n' 
          v = (thisMa.sum( vv, axis=islt ) + thisMa.sum( vv1, axis=islt ) )/3.
          v = thisMa.masked_values( v, -999. )
          pmess += 'qqqq<br/>\n' 
        html += '<br/> calling slice2table'
        data_display = slice2table( title, xname, xAxes[lon0:lon9+1], yname, yAxes[yslice], v, isly > islx, fmt, factor, mime=mime )
        pmess += 'qqqq<br/>\n' 
        html += '<br/> back from slice2table'
      
      if mime == 'html':
        data_display += '<input type="hidden" name="%s" value="%7.3f"/>\n' % ('YY0',ytarg0)
        data_display += '<input type="hidden" name="%s" value="%7.3f"/>\n' % ('YY9',ytarg9)
        data_display += '<input type="hidden" name="%s" value="%7.3f"/>\n' % ('XX0',xtarg0)
        data_display += '<input type="hidden" name="%s" value="%7.3f"/>\n' % ('XX9',xtarg9)
      html += '<br/>display generated' 
      if mime == 'html':
        try:
          x = 0
          import os
          ii = open( self.tmpl_xyt1, 'r' )
          x = 3
          html_pat = ii.readlines() 
          x = 1
          html_pat = string.join( html_pat )
          x = 2
          table_html = html_pat % locals()

        except:
          if x == 2:
            data_display += '<br/> could not generate table'
          elif x == 1:
            data_display += '<br/> could not join template'
          elif x == 3:
            data_display += '<br/> could not read template'
          else:
            data_display += '<br/> could _open template'
          table_html = ' '
      else:
          table_html = ' '
      rv = 0
      table_html += dm2
      pmess += str( data.shape )
      pmess += '<br/> %s ' % islt
      return (rv,html,table_html, data_display)
    except:
      return (1, 'failed','   ',html + pmess)