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)
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)