def zfactor(zaxis_id,zfactor_name,units="",axis_ids=None,type=None,zfactor_values=None,zfactor_bounds=None): if not isinstance(zaxis_id,(int,numpy.int,numpy.int32)): raise Exception, "error zaxis_id must be a number" zaxis_id = int(zaxis_id) if not isinstance(zfactor_name,str): raise Exception, "Error you must pass a string for the variable zfactor_name" if not isinstance(units,str): raise Exception, "Error you must pass a string for the variable units" if numpy.ma.isMA(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_cdms2 and cdms2.isVariable(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_cdms2 and cdms2.isVariable(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif isinstance(axis_ids,(list,tuple)): axis_ids = numpy.ascontiguousarray(axis_ids) elif axis_ids is None: pass elif isinstance(axis_ids,(int,numpy.int,numpy.int32)): axis_ids = numpy.array([axis_ids,]) elif not isinstance(axis_ids, numpy.ndarray): raise Exception, "Error could not convert axis_ids list to a numpy array" if numpy.ndim(axis_ids)>1: raise Exception, "error axis_ids list/array must be 1D" if axis_ids is None: ndims = 0 axis_ids = numpy.array(1) else: ndims = len(axis_ids) ## if ndims>1 and zfactor_values is not None: ## raise Exception, "Error you can only pass zfactor_values for zfactor with rank <=1" ## if ndims>1 and zfactor_bounds is not None: ## raise Exception, "Error you can only pass zfactor_bounds for zfactor with rank <=1" if zfactor_values is not None: if isinstance(zfactor_values,(float,int,numpy.float,numpy.float32,numpy.int,numpy.int32)): zfactor_values = numpy.array((zfactor_values,)) elif numpy.ma.isMA(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif has_cdms2 and cdms2.isVariable(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif isinstance(zfactor_values,(list,tuple)): zfactor_values = numpy.ascontiguousarray(zfactor_values) elif not isinstance(zfactor_values, numpy.ndarray): raise Exception, "Error could not convert zfactor_values to a numpy array" if type is None: try: type = zfactor_values.dtype.char except: if isinstance(zfactor_values,(float,numpy.float,numpy.float32)): type = 'f' elif isinstance(zfactor_values,(int,numpy.int,numpy.int32)): type = 'd' else: raise Exception, "Error unknown type for zfactor_values: %s" % repr(zfactor_values) elif type is None: type='d' if not isinstance(type,str): raise Exception, "error tpye must a a string" type = type.lower() if type == 's': type ='c' if not type in ["c","d","f","l","i"]: raise Exception, 'error unknown type: "%s", must be one of: "c","d","f","l","i"' if zfactor_bounds is not None: if numpy.ma.isMA(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif has_cdms2 and cdms2.isVariable(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif isinstance(zfactor_bounds,(list,tuple)): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds) elif not isinstance(zfactor_bounds, numpy.ndarray): raise Exception, "Error could not convert zfactor_bounds to a numpy array" if numpy.ndim(zfactor_bounds)>2: raise Exception, "error zfactor_bounds must be rank 2 at most" elif numpy.ndim(zfactor_bounds)==2: if zfactor_bounds.shape[1]!=2: raise Exception, "error zfactor_bounds' 2nd dimension must be of length 2" bnds =[] b = zfactor_bounds[0] for i in range(zfactor_bounds.shape[0]): b = zfactor_bounds[i] bnds.append(b[0]) if (i<zfactor_bounds.shape[0]-1) and (b[1]!=zfactor_bounds[i+1][0]): raise Exception, "error zfactor_bounds have gaps between them" bnds.append(zfactor_bounds[-1][1]) zfactor_bounds=numpy.array(bnds) axis_ids = axis_ids.astype('i') ## print "sending",zaxis_id,zfactor_name,units,ndims,axis_ids,type,zfactor_values,zfactor_bounds return _cmor.zfactor(zaxis_id,zfactor_name,units,ndims,axis_ids,type,zfactor_values,zfactor_bounds)
def zfactor(zaxis_id, zfactor_name, units="", axis_ids=None, type=None, zfactor_values=None, zfactor_bounds=None): if not isinstance(zaxis_id, (int, numpy.int, numpy.int32)): raise Exception, "error zaxis_id must be a number" zaxis_id = int(zaxis_id) if not isinstance(zfactor_name, str): raise Exception, "Error you must pass a string for the variable zfactor_name" if not isinstance(units, str): raise Exception, "Error you must pass a string for the variable units" if numpy.ma.isMA(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_cdms2 and cdms2.isVariable(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif has_cdms2 and cdms2.isVariable(axis_ids): axis_ids = numpy.ascontiguousarray(axis_ids.filled()) elif isinstance(axis_ids, (list, tuple)): axis_ids = numpy.ascontiguousarray(axis_ids) elif axis_ids is None: pass elif isinstance(axis_ids, (int, numpy.int, numpy.int32)): axis_ids = numpy.array([ axis_ids, ]) elif not isinstance(axis_ids, numpy.ndarray): raise Exception, "Error could not convert axis_ids list to a numpy array" if numpy.ndim(axis_ids) > 1: raise Exception, "error axis_ids list/array must be 1D" if axis_ids is None: ndims = 0 axis_ids = numpy.array(1) else: ndims = len(axis_ids) ## if ndims>1 and zfactor_values is not None: ## raise Exception, "Error you can only pass zfactor_values for zfactor with rank <=1" ## if ndims>1 and zfactor_bounds is not None: ## raise Exception, "Error you can only pass zfactor_bounds for zfactor with rank <=1" if zfactor_values is not None: if isinstance( zfactor_values, (float, int, numpy.float, numpy.float32, numpy.int, numpy.int32)): zfactor_values = numpy.array((zfactor_values, )) elif numpy.ma.isMA(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif has_cdms2 and cdms2.isVariable(zfactor_values): zfactor_values = numpy.ascontiguousarray(zfactor_values.filled()) elif isinstance(zfactor_values, (list, tuple)): zfactor_values = numpy.ascontiguousarray(zfactor_values) elif not isinstance(zfactor_values, numpy.ndarray): raise Exception, "Error could not convert zfactor_values to a numpy array" if type is None: try: type = zfactor_values.dtype.char except: if isinstance(zfactor_values, (float, numpy.float, numpy.float32)): type = 'f' elif isinstance(zfactor_values, (int, numpy.int, numpy.int32)): type = 'd' else: raise Exception, "Error unknown type for zfactor_values: %s" % repr( zfactor_values) elif type is None: type = 'd' if not isinstance(type, str): raise Exception, "error tpye must a a string" type = type.lower() if type == 's': type = 'c' if not type in ["c", "d", "f", "l", "i"]: raise Exception, 'error unknown type: "%s", must be one of: "c","d","f","l","i"' if zfactor_bounds is not None: if numpy.ma.isMA(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif has_oldma and numpy.oldnumeric.ma.isMA(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif has_cdms2 and cdms2.isVariable(zfactor_bounds): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds.filled()) elif isinstance(zfactor_bounds, (list, tuple)): zfactor_bounds = numpy.ascontiguousarray(zfactor_bounds) elif not isinstance(zfactor_bounds, numpy.ndarray): raise Exception, "Error could not convert zfactor_bounds to a numpy array" if numpy.ndim(zfactor_bounds) > 2: raise Exception, "error zfactor_bounds must be rank 2 at most" elif numpy.ndim(zfactor_bounds) == 2: if zfactor_bounds.shape[1] != 2: raise Exception, "error zfactor_bounds' 2nd dimension must be of length 2" bnds = [] b = zfactor_bounds[0] for i in range(zfactor_bounds.shape[0]): b = zfactor_bounds[i] bnds.append(b[0]) if (i < zfactor_bounds.shape[0] - 1) and ( b[1] != zfactor_bounds[i + 1][0]): raise Exception, "error zfactor_bounds have gaps between them" bnds.append(zfactor_bounds[-1][1]) zfactor_bounds = numpy.array(bnds) axis_ids = axis_ids.astype('i') ## print "sending",zaxis_id,zfactor_name,units,ndims,axis_ids,type,zfactor_values,zfactor_bounds return _cmor.zfactor(zaxis_id, zfactor_name, units, ndims, axis_ids, type, zfactor_values, zfactor_bounds)