Пример #1
0
def grid(axis_ids,latitude=None,longitude=None,latitude_vertices=None,longitude_vertices=None,nvertices=None):
    """ Creates a cmor grid
    Usage:
    grid_id = grid(axis_ids,latitude,longitude,latitude_vertices=None,longitude_vertices=None)
    Where:
    axis_ids : array contianing the axes ids for this grid.
    latitude/longitude: the values for longitude/latitude arrays (unless it is a time varying grid)
    latitude_vertices/longitude_vertices: coordinates of vertices for each latitude/latitude (unless it is a time varying grid)
    """
    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 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 axes list/array must be 1D"

    if latitude is not None:
        latitude = _to_numpy(latitude, 'latitude')

        if numpy.ndim(latitude)!=len(axis_ids):
            raise Exception, "latitude's rank does not match number of axes passed via axis_ids"

        type = latitude.dtype.char
        nvert = 0
        if not type in ['d','f','i','l']:
            raise Exception, "latitude array must be of type 'd','f','l' or 'i'"

        longitude = _to_numpy(longitude, 'longitude')

        if numpy.ndim(longitude)!=len(axis_ids):
            raise Exception, "longitude's rank does not match number of axes passed via axis_ids"

    ##     print 'longitude type:',longitude.dtype.char
        if longitude.dtype.char!=type:
            longitude = longitude.astype(type)
    elif longitude is not None:
        raise Exception, "latitude and longitude must be BOTH an array or None"
    else:
        type='f'
        if nvertices is None :
            nvert=0
        else:
            nvert = nvertices

    if latitude_vertices is not None:
        latitude_vertices = _to_numpy(latitude_vertices, 'latitude_vertices')

        if numpy.ndim(latitude_vertices)!=len(axis_ids)+1:
            raise Exception, "latitude_vertices's rank does not match number of axes passed via axis_ids +1 (for vertices)"
##         print 'latitude_vert type:',latitude_vertices.dtype.char
        if latitude_vertices.dtype.char!=type:
            latitude_vertices = latitude_vertices.astype(type)
        nvert = latitude_vertices.shape[-1]
        if nvertices is not None:
            if nvert!=nvertices:
                raise Exception,"you passed nvertices as: %i, but from your latitude_vertices it seems to be: %i" % (nvertices,nvert)

    if longitude_vertices is not None:
        longitude_vertices = _to_numpy(longitude_vertices, 'longitude_vertices')
        if numpy.ndim(longitude_vertices)!=len(axis_ids)+1:
            raise Exception, "longitude_vertices's rank does not match number of axes passed via axis_ids +1 (for vertices)"
##         print 'longitude_vert type:',longitude_vertices.dtype.char
        if longitude_vertices.dtype.char!=type:
            longitude_vertices = longitude_vertices.astype(type)
        nvert2 = longitude_vertices.shape[-1]
        if latitude_vertices is None:
            nvert = nvert2
        elif nvert!=nvert2:
            raise Exception, "error in shape longitude_vertices and latitude_vertices seem to have different # of vertices: %i vs %i, %s" % (nvert,nvert2, str(longitude_vertices.shape ))
        if nvertices is not None:
            if nvert!=nvertices:
                raise Exception,"you passed nvertices as: %i, but from your longitude_vertices it seems to be: %i" % (nvertices,nvert)


##     if area is not None:
##         if not isinstance(area,numpy.ndarray):
##             try:
##                 area = numpy.ascontiguousarray(area.filled())
##             except:
##                 raise Exception, "Error could not convert area to a numpy array"
##             if numpy.rank(area)!=len(axis_ids):
##                 raise Exception, "area's rank does not match number of axes passed via axis_ids"
##         if area.dtype.char!=type:
##             area = area.astype(type)
    n = len(axis_ids)
    axis_ids=axis_ids.astype('i');
    return _cmor.grid(n,axis_ids,type,latitude,longitude,nvert,latitude_vertices,longitude_vertices)
Пример #2
0
def grid(axis_ids,
         latitude=None,
         longitude=None,
         latitude_vertices=None,
         longitude_vertices=None,
         nvertices=None):
    """ Creates a cmor grid
    Usage:
    grid_id = grid(axis_ids,latitude,longitude,latitude_vertices=None,longitude_vertices=None)
    Where:
    axis_ids : array contianing the axes ids for this grid.
    latitude/longitude: the values for longitude/latitude arrays (unless it is a time varying grid)
    latitude_vertices/longitude_vertices: coordinates of vertices for each latitude/latitude (unless it is a time varying grid)
    """
    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 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 axes list/array must be 1D"

    if latitude is not None:
        latitude = _to_numpy(latitude, 'latitude')

        if numpy.ndim(latitude) != len(axis_ids):
            raise Exception, "latitude's rank does not match number of axes passed via axis_ids"

        type = latitude.dtype.char
        nvert = 0
        if not type in ['d', 'f', 'i', 'l']:
            raise Exception, "latitude array must be of type 'd','f','l' or 'i'"

        longitude = _to_numpy(longitude, 'longitude')

        if numpy.ndim(longitude) != len(axis_ids):
            raise Exception, "longitude's rank does not match number of axes passed via axis_ids"

    ##     print 'longitude type:',longitude.dtype.char
        if longitude.dtype.char != type:
            longitude = longitude.astype(type)
    elif longitude is not None:
        raise Exception, "latitude and longitude must be BOTH an array or None"
    else:
        type = 'f'
        if nvertices is None:
            nvert = 0
        else:
            nvert = nvertices

    if latitude_vertices is not None:
        latitude_vertices = _to_numpy(latitude_vertices, 'latitude_vertices')

        if numpy.ndim(latitude_vertices) != len(axis_ids) + 1:
            raise Exception, "latitude_vertices's rank does not match number of axes passed via axis_ids +1 (for vertices)"
##         print 'latitude_vert type:',latitude_vertices.dtype.char
        if latitude_vertices.dtype.char != type:
            latitude_vertices = latitude_vertices.astype(type)
        nvert = latitude_vertices.shape[-1]
        if nvertices is not None:
            if nvert != nvertices:
                raise Exception, "you passed nvertices as: %i, but from your latitude_vertices it seems to be: %i" % (
                    nvertices, nvert)

    if longitude_vertices is not None:
        longitude_vertices = _to_numpy(longitude_vertices,
                                       'longitude_vertices')
        if numpy.ndim(longitude_vertices) != len(axis_ids) + 1:
            raise Exception, "longitude_vertices's rank does not match number of axes passed via axis_ids +1 (for vertices)"
##         print 'longitude_vert type:',longitude_vertices.dtype.char
        if longitude_vertices.dtype.char != type:
            longitude_vertices = longitude_vertices.astype(type)
        nvert2 = longitude_vertices.shape[-1]
        if latitude_vertices is None:
            nvert = nvert2
        elif nvert != nvert2:
            raise Exception, "error in shape longitude_vertices and latitude_vertices seem to have different # of vertices: %i vs %i, %s" % (
                nvert, nvert2, str(longitude_vertices.shape))
        if nvertices is not None:
            if nvert != nvertices:
                raise Exception, "you passed nvertices as: %i, but from your longitude_vertices it seems to be: %i" % (
                    nvertices, nvert)


##     if area is not None:
##         if not isinstance(area,numpy.ndarray):
##             try:
##                 area = numpy.ascontiguousarray(area.filled())
##             except:
##                 raise Exception, "Error could not convert area to a numpy array"
##             if numpy.rank(area)!=len(axis_ids):
##                 raise Exception, "area's rank does not match number of axes passed via axis_ids"
##         if area.dtype.char!=type:
##             area = area.astype(type)
    n = len(axis_ids)
    axis_ids = axis_ids.astype('i')
    return _cmor.grid(n, axis_ids, type, latitude, longitude, nvert,
                      latitude_vertices, longitude_vertices)