def axis(table_entry,units=None,length=None,coord_vals=None,cell_bounds=None,interval=None): """ Creates an cmor_axis Usage: axis_id = axis(table_entry,units=None,length=None,coord_vals=None,cell_bounds=None,interval=None) Where: table_entry: table_entry in the cmor table units: the axis units length: the number of coord_vals to actuall y use, or simply the number of coord_vals in case in index_only axes coord_vals: cmds2 axis or numpy/MV2 array (1D) cell_bounds: numpy or MV2 array, if coord_vals is a cdms2 axis then will try to obtain bounds from it interval: a string used for time axes only (???) """ if not isinstance(table_entry,str): raise Exception, "You need to pass a table_entry to match in the cmor table" if coord_vals is None: if cell_bounds is not None: raise Exception, "you passed cell_bounds but no coords" else: if has_cdms2 and isinstance(coord_vals,cdms2.axis.TransientAxis): if units is None: if hasattr(coord_vals,"units"): units = coord_vals.units if cell_bounds is None: cell_bounds = coord_vals.getBounds() if interval is None and hasattr(coord_vals,"interval"): interval = coord_vals.interval coord_vals = numpy.ascontiguousarray(coord_vals[:]) elif isinstance(coord_vals,(list,tuple)): coord_vals = numpy.ascontiguousarray(coord_vals) elif has_cdms2 and cdms2.isVariable(coord_vals): if units is None: if hasattr(coord_vals,"units"): units = coord_vals.units if interval is None and hasattr(coord_vals,"interval"): interval = coord_vals.interval coord_vals = numpy.ascontiguousarray(coord_vals.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(coord_vals): coord_vals = numpy.ascontiguousarray(coord_vals.filled()) elif numpy.ma.isMA(coord_vals): coord_vals = numpy.ascontiguousarray(coord_vals.filled()) if not isinstance(coord_vals,numpy.ndarray): raise Exception, "Error coord_vals must be an array or cdms2 axis or list/tuple" if numpy.ndim(coord_vals)>1: raise Exception, "Error, you must pass a 1D array!" if numpy.ma.isMA(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_cdms2 and cdms2.isVariable(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_cdms2 and cdms2.isVariable(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif isinstance(cell_bounds,(list,tuple)): cell_bounds = numpy.ascontiguousarray(cell_bounds) if cell_bounds is not None: if numpy.ndim(cell_bounds)>2: raise Exception, "Error cell_bounds rank must be at most 2" if numpy.ndim(cell_bounds)==2: if cell_bounds.shape[0]!=coord_vals.shape[0]: raise Exception, "Error, coord_vals and cell_bounds do not have the same length" if cell_bounds.shape[1]!=2: raise Exception, "Error, cell_bounds' second dimension must be of length 2" cbnds = 2 cell_bounds = numpy.ascontiguousarray(numpy.ravel(cell_bounds)) else: cbnds = 1 if len(cell_bounds)!=len(coord_vals)+1: raise Exception, "error cell_bounds are %i long and axes coord_vals are %i long this is not consistent" % (len(cell_bounds),len(coord_vals)) else: cbnds = 0 if coord_vals is not None: l = len(coord_vals) type = coord_vals.dtype.char[0] if not type in ['i','l','f','d','S']: raise Exception, "error allowed data type are: i,l,f,d or S" if type == 'S': type = 'c' cbnds = 0 for s in coord_vals: #print 'testing:',s,len(s) if len(s)>cbnds: cbnds = len(s) #cbnds+=1 else: l = 0 type = 'd' if cell_bounds is not None: if type !=cell_bounds.dtype.char: cell_bounds = cell_bounds.astype(type) if units is None: if coord_vals is not None: raise Exception, "Error you need to provide the units your coord_vals are in" else: units = "1" if interval is None: interval = "" if length is not None: l = int(length) return _cmor.axis(table_entry,units,l,coord_vals,type,cell_bounds,cbnds,interval)
def axis(table_entry, units=None, length=None, coord_vals=None, cell_bounds=None, interval=None): """ Creates an cmor_axis Usage: axis_id = axis(table_entry,units=None,length=None,coord_vals=None,cell_bounds=None,interval=None) Where: table_entry: table_entry in the cmor table units: the axis units length: the number of coord_vals to actuall y use, or simply the number of coord_vals in case in index_only axes coord_vals: cmds2 axis or numpy/MV2 array (1D) cell_bounds: numpy or MV2 array, if coord_vals is a cdms2 axis then will try to obtain bounds from it interval: a string used for time axes only (???) """ if not isinstance(table_entry, str): raise Exception, "You need to pass a table_entry to match in the cmor table" if coord_vals is None: if cell_bounds is not None: raise Exception, "you passed cell_bounds but no coords" else: if has_cdms2 and isinstance(coord_vals, cdms2.axis.TransientAxis): if units is None: if hasattr(coord_vals, "units"): units = coord_vals.units if cell_bounds is None: cell_bounds = coord_vals.getBounds() if interval is None and hasattr(coord_vals, "interval"): interval = coord_vals.interval coord_vals = numpy.ascontiguousarray(coord_vals[:]) elif isinstance(coord_vals, (list, tuple)): coord_vals = numpy.ascontiguousarray(coord_vals) elif has_cdms2 and cdms2.isVariable(coord_vals): if units is None: if hasattr(coord_vals, "units"): units = coord_vals.units if interval is None and hasattr(coord_vals, "interval"): interval = coord_vals.interval coord_vals = numpy.ascontiguousarray(coord_vals.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(coord_vals): coord_vals = numpy.ascontiguousarray(coord_vals.filled()) elif numpy.ma.isMA(coord_vals): coord_vals = numpy.ascontiguousarray(coord_vals.filled()) if not isinstance(coord_vals, numpy.ndarray): raise Exception, "Error coord_vals must be an array or cdms2 axis or list/tuple" if numpy.ndim(coord_vals) > 1: raise Exception, "Error, you must pass a 1D array!" if numpy.ma.isMA(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_cdms2 and cdms2.isVariable(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif has_cdms2 and cdms2.isVariable(cell_bounds): cell_bounds = numpy.ascontiguousarray(cell_bounds.filled()) elif isinstance(cell_bounds, (list, tuple)): cell_bounds = numpy.ascontiguousarray(cell_bounds) if cell_bounds is not None: if numpy.ndim(cell_bounds) > 2: raise Exception, "Error cell_bounds rank must be at most 2" if numpy.ndim(cell_bounds) == 2: if cell_bounds.shape[0] != coord_vals.shape[0]: raise Exception, "Error, coord_vals and cell_bounds do not have the same length" if cell_bounds.shape[1] != 2: raise Exception, "Error, cell_bounds' second dimension must be of length 2" cbnds = 2 cell_bounds = numpy.ascontiguousarray(numpy.ravel(cell_bounds)) else: cbnds = 1 if len(cell_bounds) != len(coord_vals) + 1: raise Exception, "error cell_bounds are %i long and axes coord_vals are %i long this is not consistent" % ( len(cell_bounds), len(coord_vals)) else: cbnds = 0 if coord_vals is not None: l = len(coord_vals) type = coord_vals.dtype.char[0] if not type in ['i', 'l', 'f', 'd', 'S']: raise Exception, "error allowed data type are: i,l,f,d or S" if type == 'S': type = 'c' cbnds = 0 for s in coord_vals: #print 'testing:',s,len(s) if len(s) > cbnds: cbnds = len(s) #cbnds+=1 else: l = 0 type = 'd' if cell_bounds is not None: if type != cell_bounds.dtype.char: cell_bounds = cell_bounds.astype(type) if units is None: if coord_vals is not None: raise Exception, "Error you need to provide the units your coord_vals are in" else: units = "1" if interval is None: interval = "" if length is not None: l = int(length) return _cmor.axis(table_entry, units, l, coord_vals, type, cell_bounds, cbnds, interval)