コード例 #1
0
ファイル: pywrapper.py プロジェクト: jkettleb/cmor
def write(var_id,data,ntimes_passed=None,file_suffix="",time_vals=None,time_bnds=None,store_with=None):

    """ write data to a cmor variable
    Usage:
    ierr = write(var_id,data,ntimes_passed=None,file_suffix="",time_vals=None,time_bnds=None,store_with=None
    """
    if not isinstance(var_id,(int,numpy.int,numpy.int32)):
        raise Exception, "error var_id must be an integer"
    var_id = int(var_id)

    if not isinstance(file_suffix,str):
        raise Exception,  "Error file_suffix must be a string"

    if store_with is not None:
        if not isinstance(store_with,(int,numpy.int,numpy.int32)):
            raise Exception, "error store_with must be an integer"
        store_with = int(store_with)

    if numpy.ma.isMA(data):
        data = numpy.ascontiguousarray(data.filled())
    elif has_oldma and numpy.oldnumeric.ma.isMA(data):
        data = numpy.ascontiguousarray(data.filled())
    elif has_cdms2 and cdms2.isVariable(data):
        if time_vals is None:
            time_vals = data.getTime()
        data = numpy.ascontiguousarray(data.filled())
    elif isinstance(data,(list,tuple)):
        data = numpy.ascontiguousarray(data)
    elif not isinstance(data, numpy.ndarray):
            raise Exception, "Error could not convert data to a numpy array"


    if time_vals is None:
        pass
    elif numpy.ma.isMA(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif has_oldma and numpy.oldnumeric.ma.isMA(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif has_cdms2 and isinstance(time_vals,cdms2.axis.TransientAxis):
        if time_bnds is None:
            time_bnds = time_vals.getBounds()
        time_vals = numpy.ascontiguousarray(time_vals[:])
    elif has_cdms2 and cdms2.isVariable(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif isinstance(time_vals,(list,tuple)):
        time_vals = numpy.ascontiguousarray(time_vals)
    elif not isinstance(time_vals, numpy.ndarray):
        try:
            time_vals = numpy.ascontiguousarray(time_vals)
        except:
            raise Exception, "Error could not convert time_vals to a numpy array"

    if time_vals is not None:
        type = time_vals.dtype.char
        if not type in ['f','d','i','l']:
            raise Exception, "Error time_vals type must one of: 'f','d','i','l', please convert first"
        time_vals=time_vals.astype("d")


    if ntimes_passed is None:
        if time_vals is None:
            ntimes_passed = 0
        else:
            ntimes_passed = len(time_vals)
    if not isinstance(ntimes_passed,(int,numpy.int,numpy.int32)):
        raise Exception, "error ntimes_passed must be an integer"
    ntimes_passed = int(ntimes_passed)


    #At that ponit we check that shapes matches!
    goodshape = _cmor.get_original_shape(var_id,1)
    osh = data.shape
    ogoodshape=list(goodshape)
    sh=list(osh)
    j=0
    while sh.count(1)>0:
        sh.remove(1)
    while goodshape.count(1)>0:
        goodshape.remove(1)
    for i in range(len(goodshape)):
        if goodshape[i]!=0:
            if sh[j]!=goodshape[i]:
                if goodshape[i]!=1:
                    raise Exception,"Error: your data shape (%s) does not match the expected variable shape (%s)\nCheck your variable dimensions before caling cmor_write" % (str(osh),str(ogoodshape))
            j+=1
        elif ntimes_passed!=1:
            j+=1



    data = numpy.ascontiguousarray(numpy.ravel(data))


    if time_bnds is not None:
        if numpy.ma.isMA(time_bnds):
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif has_oldma and numpy.oldnumeric.ma.isMA(time_bnds):
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif has_cdms2 and cdms2.isVariable(time_bnds):
            if time_vals is None:
                time_vals = time_bnds.getTime()
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif isinstance(time_bnds,(list,tuple)):
            time_bnds = numpy.ascontiguousarray(time_bnds)
        elif not isinstance(time_bnds, numpy.ndarray):
            raise Exception, "Error could not convert time_bnds to a numpy array"

        if numpy.ndim(time_bnds)>2:
            raise Exception, "bounds rank cannot be greater than 2"
        elif numpy.ndim(time_bnds)==2:
            if time_bnds.shape[1]!=2:
                raise Exception, "error time_bnds' 2nd dimension must be of length 2"
            bnds =[]
            if time_bnds.shape[0] > 1:
                _check_time_bounds_contiguous(time_bnds)
                bnds = _flatten_time_bounds(time_bnds)
            else:
                bnds = time_bnds.ravel()
            time_bnds=numpy.array(bnds)
        else: # ok it is a rank 1!
            if numpy.ndim(time_vals)==0:
                ltv=1
            else:
                ltv=len(time_vals)
            if len(time_bnds)!=ltv+1:
                raise Exception,"error time_bnds if 1D must be 1 elt greater than time_vals, you have %i vs %i" % (len(time_bnds),ltv)
            bnds=[]
            for i in range(ltv):
                bnds.append([time_bnds[i],time_bnds[i+1]])
            bnds=numpy.array(bnds)
            bnds = _flatten_time_bounds(bnds)
            time_bnds=numpy.array(bnds)

    if time_bnds is not None:
        type = time_bnds.dtype.char
        if not type in ['f','d','i','l']:
            raise Exception, "Error time_bnds type must one of: 'f','d','i','l', please convert first"
        time_bnds=time_bnds.astype("d")

    type = data.dtype.char
    if not type in ['f','d','i','l']:
        raise Exception, "Error data type must one of: 'f','d','i','l', please convert first"

    return _cmor.write(var_id,data,type,ntimes_passed,time_vals,time_bnds,store_with)
コード例 #2
0
def write(var_id,
          data,
          ntimes_passed=None,
          file_suffix="",
          time_vals=None,
          time_bnds=None,
          store_with=None):
    """ write data to a cmor variable
    Usage:
    ierr = write(var_id,data,ntimes_passed=None,file_suffix="",time_vals=None,time_bnds=None,store_with=None
    """
    if not isinstance(var_id, (int, numpy.int, numpy.int32)):
        raise Exception, "error var_id must be an integer"
    var_id = int(var_id)

    if not isinstance(file_suffix, str):
        raise Exception, "Error file_suffix must be a string"

    if store_with is not None:
        if not isinstance(store_with, (int, numpy.int, numpy.int32)):
            raise Exception, "error store_with must be an integer"
        store_with = int(store_with)

    if numpy.ma.isMA(data):
        data = numpy.ascontiguousarray(data.filled())
    elif has_oldma and numpy.oldnumeric.ma.isMA(data):
        data = numpy.ascontiguousarray(data.filled())
    elif has_cdms2 and cdms2.isVariable(data):
        if time_vals is None:
            time_vals = data.getTime()
        data = numpy.ascontiguousarray(data.filled())
    elif isinstance(data, (list, tuple)):
        data = numpy.ascontiguousarray(data)
    elif not isinstance(data, numpy.ndarray):
        raise Exception, "Error could not convert data to a numpy array"

    if time_vals is None:
        pass
    elif numpy.ma.isMA(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif has_oldma and numpy.oldnumeric.ma.isMA(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif has_cdms2 and isinstance(time_vals, cdms2.axis.TransientAxis):
        if time_bnds is None:
            time_bnds = time_vals.getBounds()
        time_vals = numpy.ascontiguousarray(time_vals[:])
    elif has_cdms2 and cdms2.isVariable(time_vals):
        time_vals = numpy.ascontiguousarray(time_vals.filled())
    elif isinstance(time_vals, (list, tuple)):
        time_vals = numpy.ascontiguousarray(time_vals)
    elif not isinstance(time_vals, numpy.ndarray):
        try:
            time_vals = numpy.ascontiguousarray(time_vals)
        except:
            raise Exception, "Error could not convert time_vals to a numpy array"

    if time_vals is not None:
        type = time_vals.dtype.char
        if not type in ['f', 'd', 'i', 'l']:
            raise Exception, "Error time_vals type must one of: 'f','d','i','l', please convert first"
        time_vals = time_vals.astype("d")

    if ntimes_passed is None:
        if time_vals is None:
            ntimes_passed = 0
        else:
            ntimes_passed = len(time_vals)
    if not isinstance(ntimes_passed, (int, numpy.int, numpy.int32)):
        raise Exception, "error ntimes_passed must be an integer"
    ntimes_passed = int(ntimes_passed)

    #At that ponit we check that shapes matches!
    goodshape = _cmor.get_original_shape(var_id, 1)
    osh = data.shape
    ogoodshape = list(goodshape)
    sh = list(osh)
    j = 0
    while sh.count(1) > 0:
        sh.remove(1)
    while goodshape.count(1) > 0:
        goodshape.remove(1)
    for i in range(len(goodshape)):
        if goodshape[i] != 0:
            if sh[j] != goodshape[i]:
                if goodshape[i] != 1:
                    raise Exception, "error your data shape (%s) does not match the expect variable shape (%s)" % (
                        str(osh), str(ogoodshape))
            j += 1
        elif ntimes_passed != 1:
            j += 1

    data = numpy.ascontiguousarray(numpy.ravel(data))

    if time_bnds is not None:
        if numpy.ma.isMA(time_bnds):
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif has_oldma and numpy.oldnumeric.ma.isMA(time_bnds):
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif has_cdms2 and cdms2.isVariable(time_bnds):
            if time_vals is None:
                time_vals = time_bnds.getTime()
            time_bnds = numpy.ascontiguousarray(time_bnds.filled())
        elif isinstance(time_bnds, (list, tuple)):
            time_bnds = numpy.ascontiguousarray(time_bnds)
        elif not isinstance(time_bnds, numpy.ndarray):
            raise Exception, "Error could not convert time_bnds to a numpy array"

        if numpy.ndim(time_bnds) > 2:
            raise Exception, "bounds rank cannot be greater than 2"
        elif numpy.ndim(time_bnds) == 2:
            if time_bnds.shape[1] != 2:
                raise Exception, "error time_bnds' 2nd dimension must be of length 2"
            bnds = []
            if time_bnds.shape[0] > 1:
                _check_time_bounds_contiguous(time_bnds)
                bnds = _flatten_time_bounds(time_bnds)
            else:
                bnds = time_bnds.ravel()
            time_bnds = numpy.array(bnds)
        else:  # ok it is a rank 1!
            if numpy.ndim(time_vals) == 0:
                ltv = 1
            else:
                ltv = len(time_vals)
            if len(time_bnds) != ltv + 1:
                raise Exception, "error time_bnds if 1D must be 1 elt greater than time_vals, you have %i vs %i" % (
                    len(time_bnds), ltv)
            bnds = []
            for i in range(ltv):
                bnds.append([time_bnds[i], time_bnds[i + 1]])
            bnds = numpy.array(bnds)
            bnds = _flatten_time_bounds(bnds)
            time_bnds = numpy.array(bnds)

    if time_bnds is not None:
        type = time_bnds.dtype.char
        if not type in ['f', 'd', 'i', 'l']:
            raise Exception, "Error time_bnds type must one of: 'f','d','i','l', please convert first"
        time_bnds = time_bnds.astype("d")

    type = data.dtype.char
    if not type in ['f', 'd', 'i', 'l']:
        raise Exception, "Error data type must one of: 'f','d','i','l', please convert first"

    return _cmor.write(var_id, data, type, ntimes_passed, time_vals, time_bnds,
                       store_with)