Beispiel #1
0
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)
Beispiel #2
0
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)