def set_zlim(self, zmin, zmax): """ Set the *z* limits of the current axes. :param zmin: (*float*) Minimum limit of the z axis. :param zmax: (*float*) Maximum limit of the z axis. """ if isinstance(zmin, datetime.datetime): zmin = miutil.date2num(zmin) if isinstance(zmax, datetime.datetime): zmax = miutil.date2num(zmax) self.axes.setZMinMax(zmin, zmax)
def set_xlim(self, xmin, xmax): """ Set the *x* limits of the current axes. :param xmin: (*float*) Minimum limit of the x axis. :param xmax: (*float*) Maximum limit of the x axis. """ if isinstance(xmin, datetime.datetime): xmin = miutil.date2num(xmin) if isinstance(xmax, datetime.datetime): xmax = miutil.date2num(xmax) self.axes.setXMinMax(xmin, xmax)
def set_xlim(self, xmin, xmax): """ Set the *x* limits of the current axes. :param xmin: (*float*) Minimum limit of the x axis. :param xmax: (*float*) Maximum limit of the x axis. """ if isinstance(xmin, datetime.datetime): xmin = miutil.date2num(xmin) if isinstance(xmax, datetime.datetime): xmax = miutil.date2num(xmax) self.axes.setXMinMax(xmin, xmax)
def set_ylim(self, ymin, ymax): """ Set the *y* limits of the current axes. :param ymin: (*float*) Minimum limit of the y axis. :param ymax: (*float*) Maximum limit of the y axis. """ if isinstance(ymin, datetime.datetime): ymin = miutil.date2num(ymin) if isinstance(ymax, datetime.datetime): ymax = miutil.date2num(ymax) self.axes.setYMinMax(ymin, ymax)
def set_zlim(self, zmin, zmax): """ Set the *z* limits of the current axes. :param zmin: (*float*) Minimum limit of the z axis. :param zmax: (*float*) Maximum limit of the z axis. """ if isinstance(zmin, datetime.datetime): zmin = miutil.date2num(zmin) if isinstance(zmax, datetime.datetime): zmax = miutil.date2num(zmax) self.axes.setZMinMax(zmin, zmax)
def set_ylim(self, ymin, ymax): """ Set the *y* limits of the current axes. :param ymin: (*float*) Minimum limit of the y axis. :param ymax: (*float*) Maximum limit of the y axis. """ if isinstance(ymin, datetime.datetime): ymin = miutil.date2num(ymin) if isinstance(ymax, datetime.datetime): ymax = miutil.date2num(ymax) self.axes.setYMinMax(ymin, ymax)
def getplotdata(data): if isinstance(data, (MIArray, DimArray)): return data.asarray() elif isinstance(data, (list, tuple)): if isinstance(data[0], datetime.datetime): dd = [] for d in data: v = miutil.date2num(d) dd.append(v) return minum.array(dd).array else: return minum.array(data).array else: return minum.array([data]).array
def addtdim(self, t): ''' Add a time dimension as first dimension. ''' if self.tdim() is None: dim = Dimension(DimensionType.T) t = miutil.date2num(t) dim.setDimValues([t]) self.dims.insert(0, dim) self.ndim = len(self.dims) ss = list(self.shape) ss.insert(0, 1) ss = tuple(ss) self.array = self.array.reshape(ss) self.shape = self.array.shape
def getplotdata(data): if isinstance(data, NDArray): if data.dtype == np.dtype.date: return data.astype('double')._array return data.asarray() elif isinstance(data, (list, tuple)): if isinstance(data[0], datetime.datetime): dd = [] for d in data: v = miutil.date2num(d) dd.append(v) return np.array(dd)._array else: return np.array(data)._array else: return np.array([data])._array
def __init__(self, variable, dataset): self.variable = variable self.dataset = dataset self.name = variable.getName() self.datatype = variable.getDataType() self.ndim = variable.getDimNumber() self.fill_value = variable.getFillValue() self.scale_factor = variable.getScaleFactor() self.add_offset = variable.getAddOffset() dims = variable.getDimensions() tdim = Dimension(DimensionType.T) times = [] for t in self.dataset.times: times.append(miutil.date2num(t)) tdim.setDimValues(times) dims[0] = tdim self.dims = dims self.tnum = len(times)
def __init__(self, variable, dataset): self.variable = variable self.dataset = dataset self.name = variable.getName() self.datatype = variable.getDataType() self.ndim = variable.getDimNumber() self.fill_value = variable.getFillValue() self.scale_factor = variable.getScaleFactor() self.add_offset = variable.getAddOffset() dims = variable.getDimensions() tdim = Dimension(DimensionType.T) times = [] for t in self.dataset.times: times.append(miutil.date2num(t)) tdim.setDimValues(times) dims[0] = tdim self.dims = dims self.tnum = len(times)
def interpn(self, xi): """ Multidimensional interpolation on regular grids. :param xi: (*list*) The coordinates to sample the gridded data at. :returns: (*float*) Interpolated value at input coordinates. """ points = [] for i in range(self.ndim): points.append(self.dims[i].getDimValue()) if isinstance(xi, (MIArray, DimArray)): xi = xi.aslist() nxi = [] for x in xi: if isinstance(x, datetime.datetime): x = miutil.date2num(x) nxi.append(x) r = ArrayUtil.interpn(points, self.asarray(), nxi) return r
def __getitem__(self, indices): if isinstance(indices, slice): k = indices if k.start is None and k.stop is None and k.step is None: r = self.dataset.dataset.read(self.name) return DimArray(r, self.dims, self.fill_value, self.proj) if isinstance(indices, tuple): allnone = True for k in indices: if isinstance(k, slice): if (not k.start is None) or (not k.stop is None) or (not k.step is None): allnone = False break else: allnone = False break if allnone: r = self.dataset.dataset.read(self.name) return DimArray(r, self.dims, self.fill_value, self.proj) if indices is None: inds = [] for i in range(self.ndim): inds.append(slice(None)) indices = tuple(inds) if isinstance(indices, str): #metadata rr = self.dataset.read(self.name) m = rr.findMember(indices) data = rr.getArray(0, m) return NDArray(data) if not isinstance(indices, tuple): inds = [] inds.append(indices) indices = inds if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' return None if not self.proj is None and not self.proj.isLonLat(): xlim = None ylim = None xidx = -1 yidx = -1 for i in range(0, self.ndim): dim = self.dims[i] if dim.getDimType() == DimensionType.X: k = indices[i] if isinstance(k, basestring): xlims = k.split(':') if len(xlims) == 1: xlim = [float(xlims[0])] else: xlim = [float(xlims[0]), float(xlims[1])] xidx = i elif dim.getDimType() == DimensionType.Y: k = indices[i] if isinstance(k, basestring): ylims = k.split(':') if len(ylims) == 1: ylim = [float(ylims[0])] else: ylim = [float(ylims[0]), float(ylims[1])] yidx = i if not xlim is None and not ylim is None: fromproj=KnownCoordinateSystems.geographic.world.WGS1984 inpt = PointD(xlim[0], ylim[0]) outpt1 = Reproject.reprojectPoint(inpt, fromproj, self.proj) if len(xlim) == 1: xlim = [outpt1.X] ylim = [outpt1.Y] else: inpt = PointD(xlim[1], ylim[1]) outpt2 = Reproject.reprojectPoint(inpt, fromproj, self.proj) xlim = [outpt1.X, outpt2.X] ylim = [outpt1.Y, outpt2.Y] indices1 = [] for i in range(0, self.ndim): if i == xidx: if len(xlim) == 1: indices1.append(str(xlim[0])) else: indices1.append(str(xlim[0]) + ':' + str(xlim[1])) elif i == yidx: if len(ylim) == 1: indices1.append(str(ylim[0])) else: indices1.append(str(ylim[0]) + ':' + str(ylim[1])) else: indices1.append(indices[i]) indices = indices1 origin = [] size = [] stride = [] ranges = [] dims = [] flips = [] onlyrange = True for i in range(0, self.ndim): isrange = True dimlen = self.dimlen(i) k = indices[i] if isinstance(k, int): if k < 0: k = self.dims[i].getLength() + k sidx = k eidx = k step = 1 elif isinstance(k, slice): if isinstance(k.start, basestring): sv = float(k.start) sidx = self.dims[i].getValueIndex(sv) elif isinstance(k.start, datetime.datetime): sv = miutil.date2num(k.start) sidx = self.dims[i].getValueIndex(sv) else: sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.dimlen(i) + sidx if isinstance(k.stop, basestring): ev = float(k.stop) eidx = self.dims[i].getValueIndex(ev) elif isinstance(k.stop, datetime.datetime): ev = miutil.date2num(k.stop) eidx = self.dims[i].getValueIndex(ev) else: eidx = self.dimlen(i) if k.stop is None else k.stop if eidx < 0: eidx = self.dimlen(i) + eidx eidx -= 1 if isinstance(k.step, basestring): nv = float(k.step) + self.dims[i].getDimValue()[0] nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx elif isinstance(k.step, datetime.timedelta): nv = miutil.date2num(k.start + k.step) nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx else: step = 1 if k.step is None else k.step if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx elif isinstance(k, list): onlyrange = False isrange = False if not isinstance(k[0], datetime.datetime): ranges.append(k) else: tlist = [] for tt in k: sv = miutil.date2num(tt) idx = self.dims[i].getValueIndex(sv) tlist.append(idx) ranges.append(tlist) k = tlist elif isinstance(k, basestring): dim = self.variable.getDimension(i) kvalues = k.split(':') sv = float(kvalues[0]) sidx = dim.getValueIndex(sv) if len(kvalues) == 1: eidx = sidx step = 1 else: ev = float(kvalues[1]) eidx = dim.getValueIndex(ev) if len(kvalues) == 2: step = 1 else: step = int(float(kvalues[2]) / dim.getDeltaValue()) if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx else: print k return None if isrange: if eidx >= dimlen: print 'Index out of range!' return None origin.append(sidx) n = eidx - sidx + 1 size.append(n) if n > 1: dim = self.variable.getDimension(i) if dim.isReverse(): step = -step dim = dim.extract(sidx, eidx, step) dim.setReverse(False) dims.append(dim) stride.append(step) if step < 0: step = abs(step) flips.append(i) rr = Range(sidx, eidx, step) ranges.append(rr) else: if len(k) > 1: dim = self.variable.getDimension(i) dim = dim.extract(k) dim.setReverse(False) dims.append(dim) #rr = self.dataset.read(self.name, origin, size, stride).reduce() if onlyrange: rr = self.dataset.dataset.read(self.name, ranges) else: rr = self.dataset.dataset.take(self.name, ranges) if rr.getSize() == 1: return rr.getObject(0) else: for i in flips: rr = rr.flip(i) rr = rr.reduce() ArrayMath.missingToNaN(rr, self.fill_value) if len(flips) > 0: rrr = Array.factory(rr.getDataType(), rr.getShape()) MAMath.copy(rrr, rr) array = NDArray(rrr) else: array = NDArray(rr) data = DimArray(array, dims, self.fill_value, self.dataset.proj) return data
def __getitem__(self, indices): if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' return None k = indices[0] if isinstance(k, int): sidx = k eidx = k step = 1 elif isinstance(k, slice): sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.tnum + sidx eidx = self.tnum if k.stop is None else k.stop if eidx < 0: eidx = self.tnum + eidx eidx -= 1 step = 1 if k.step is None else k.step elif isinstance(k, list): sidx = self.dataset.timeindex(k[0]) if len(k) == 1: eidx = sidx step = 1 else: eidx = self.dataset.timeindex(k[1]) if len(k) == 3: tt = self.dataset.timeindex(k[0] + k[3]) step = tt - sidx else: step = 1 sfidx = self.dataset.datafileindex(sidx) si = sidx isfirst = True times = [] fidx = sfidx aa = None var = None for i in range(sidx, eidx + 1, step): times.append(miutil.date2num(self.dataset.gettime(i))) fidx = self.dataset.datafileindex(i) if fidx > sfidx: ei = i - step ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(si) ii, eei = self.dataset.dftindex(ei) eei += 1 nindices = list(indices) nindices[0] = slice(ssi, eei, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) if si == ei: aa.addtdim(self.dataset.gettime(si)) if isfirst: data = aa isfirst = False else: data = minum.concatenate([data, aa]) si = i sfidx = fidx if si < eidx + 1: ei = eidx + 1 - step ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(si) ii, eei = self.dataset.dftindex(ei) eei += 1 nindices = list(indices) nindices[0] = slice(ssi, eei, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) if si == ei and eidx != sidx: aa.addtdim(self.dataset.gettime(si)) if isfirst: data = aa isfirst = False else: data = minum.concatenate([data, aa]) if aa is None: sfidx = self.dataset.datafileindex(sidx) ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(sidx) nindices = list(indices) nindices[0] = slice(ssi, ssi, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) return aa if isinstance(data, DimArray): return data else: dims = aa.dims dims[0].setDimValues(times) r = DimArray(data, dims, aa.fill_value, aa.proj) return r
def __getitem__(self, indices): #print type(indices) if not isinstance(indices, tuple): inds = [] inds.append(indices) indices = inds allint = True aindex = self.array.getIndex() i = 0 for ii in indices: if isinstance(ii, int): if ii < 0: ii = self.shape[i] + ii aindex.setDim(i, ii) else: allint = False break; i += 1 if allint: return self.array.getObject(aindex) if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' raise IndexError() if not self.proj is None and not self.proj.isLonLat(): xlim = None ylim = None xidx = -1 yidx = -1 for i in range(0, self.ndim): dim = self.dims[i] if dim.getDimType() == DimensionType.X: k = indices[i] #if isinstance(k, (tuple, list)): if isinstance(k, basestring): xlims = k.split(':') xlim = [float(xlims[0]), float(xlims[1])] xidx = i elif dim.getDimType() == DimensionType.Y: k = indices[i] #if isinstance(k, (tuple, list)): if isinstance(k, basestring): ylims = k.split(':') ylim = [float(ylims[0]), float(ylims[1])] yidx = i if not xlim is None and not ylim is None: fromproj=KnownCoordinateSystems.geographic.world.WGS1984 inpt = PointD(xlim[0], ylim[0]) outpt1 = Reproject.reprojectPoint(inpt, fromproj, self.proj) inpt = PointD(xlim[1], ylim[1]) outpt2 = Reproject.reprojectPoint(inpt, fromproj, self.proj) xlim = [outpt1.X, outpt2.X] ylim = [outpt1.Y, outpt2.Y] indices1 = [] for i in range(0, self.ndim): if i == xidx: #indices1.append(xlim indices1.append(str(xlim[0]) + ':' + str(xlim[1])) elif i == yidx: #indices1.append(ylim) indices1.append(str(ylim[0]) + ':' + str(ylim[1])) else: indices1.append(indices[i]) indices = indices1 ndims = [] ranges = [] flips = [] iszerodim = True onlyrange = True alllist = True isempty = False nshape = [] for i in range(0, self.ndim): isrange = True k = indices[i] if isinstance(k, int): if k < 0: k = self.dims[i].getLength() + k sidx = k eidx = k step = 1 alllist = False elif isinstance(k, slice): if isinstance(k.start, basestring): sv = float(k.start) sidx = self.dims[i].getValueIndex(sv) elif isinstance(k.start, datetime.datetime): sv = miutil.date2num(k.start) sidx = self.dims[i].getValueIndex(sv) else: sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.dims[i].getLength() + sidx if isinstance(k.stop, basestring): ev = float(k.stop) eidx = self.dims[i].getValueIndex(ev) elif isinstance(k.stop, datetime.datetime): ev = miutil.date2num(k.stop) eidx = self.dims[i].getValueIndex(ev) else: eidx = self.dims[i].getLength() if k.stop is None else k.stop if eidx < 0: eidx = self.dims[i].getLength() + eidx eidx -= 1 if isinstance(k.step, basestring): nv = float(k.step) + self.dims[i].getDimValue()[0] nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx elif isinstance(k.step, datetime.timedelta): nv = miutil.date2num(k.start + k.step) nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx else: step = 1 if k.step is None else k.step alllist = False elif isinstance(k, list): onlyrange = False isrange = False if not isinstance(k[0], datetime.datetime): ranges.append(k) else: tlist = [] for tt in k: sv = miutil.date2num(tt) idx = self.dims[i].getValueIndex(sv) tlist.append(idx) ranges.append(tlist) k = tlist elif isinstance(k, basestring): dim = self.dims[i] kvalues = k.split(':') sidx = dim.getValueIndex(float(kvalues[0])) if len(kvalues) == 1: eidx = sidx step = 1 else: eidx = dim.getValueIndex(float(kvalues[1])) if len(kvalues) == 2: step = 1 else: step = int(float(kvalues[2]) / dim.getDeltaValue()) if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx alllist = False else: print k raise IndexError() if isrange: if sidx >= self.shape[i]: raise IndexError() if sidx != eidx: iszerodim = False if step < 0: step = abs(step) flips.append(i) if eidx < sidx: tempidx = sidx sidx = eidx + 2 eidx = tempidx if eidx < sidx: isempty = True else: rr = Range(sidx, eidx, step) ranges.append(rr) n = eidx - sidx + 1 if n > 1: dim = self.dims[i] ndims.append(dim.extract(sidx, eidx, step)) nshape.append(eidx - sidx + 1 if eidx - sidx >= 0 else 0) else: if len(k) > 1: dim = self.dims[i] ndims.append(dim.extract(k)) if isempty: r = ArrayUtil.zeros(nshape, 'int') return MIArray(r) if onlyrange: r = ArrayMath.section(self.array, ranges) else: if alllist: r = ArrayMath.takeValues(self.array, ranges) return MIArray(r) else: r = ArrayMath.take(self.array, ranges) if r.getSize() == 1: return r.getObject(0) else: for i in flips: r = r.flip(i) rr = Array.factory(r.getDataType(), r.getShape()); MAMath.copy(rr, r); array = MIArray(rr) data = DimArray(array, ndims, self.fill_value, self.proj) return data
def __getitem__(self, indices): if indices is None: inds = [] for i in range(self.ndim): inds.append(slice(None)) indices = tuple(inds) if isinstance(indices, str): #metadata rr = self.dataset.read(self.name) m = rr.findMember(indices) data = rr.getArray(0, m) return MIArray(data) if not isinstance(indices, tuple): inds = [] inds.append(indices) indices = inds if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' return None if not self.proj is None and not self.proj.isLonLat(): xlim = None ylim = None xidx = -1 yidx = -1 for i in range(0, self.ndim): dim = self.dims[i] if dim.getDimType() == DimensionType.X: k = indices[i] if isinstance(k, basestring): xlims = k.split(':') if len(xlims) == 1: xlim = [float(xlims[0])] else: xlim = [float(xlims[0]), float(xlims[1])] xidx = i elif dim.getDimType() == DimensionType.Y: k = indices[i] if isinstance(k, basestring): ylims = k.split(':') if len(ylims) == 1: ylim = [float(ylims[0])] else: ylim = [float(ylims[0]), float(ylims[1])] yidx = i if not xlim is None and not ylim is None: fromproj=KnownCoordinateSystems.geographic.world.WGS1984 inpt = PointD(xlim[0], ylim[0]) outpt1 = Reproject.reprojectPoint(inpt, fromproj, self.proj) if len(xlim) == 1: xlim = [outpt1.X] ylim = [outpt1.Y] else: inpt = PointD(xlim[1], ylim[1]) outpt2 = Reproject.reprojectPoint(inpt, fromproj, self.proj) xlim = [outpt1.X, outpt2.X] ylim = [outpt1.Y, outpt2.Y] indices1 = [] for i in range(0, self.ndim): if i == xidx: if len(xlim) == 1: indices1.append(str(xlim[0])) else: indices1.append(str(xlim[0]) + ':' + str(xlim[1])) elif i == yidx: if len(ylim) == 1: indices1.append(str(ylim[0])) else: indices1.append(str(ylim[0]) + ':' + str(ylim[1])) else: indices1.append(indices[i]) indices = indices1 origin = [] size = [] stride = [] ranges = [] dims = [] flips = [] onlyrange = True for i in range(0, self.ndim): isrange = True dimlen = self.dimlen(i) k = indices[i] if isinstance(k, int): if k < 0: k = self.dims[i].getLength() + k sidx = k eidx = k step = 1 elif isinstance(k, slice): if isinstance(k.start, basestring): sv = float(k.start) sidx = self.dims[i].getValueIndex(sv) elif isinstance(k.start, datetime.datetime): sv = miutil.date2num(k.start) sidx = self.dims[i].getValueIndex(sv) else: sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.dimlen(i) + sidx if isinstance(k.stop, basestring): ev = float(k.stop) eidx = self.dims[i].getValueIndex(ev) elif isinstance(k.stop, datetime.datetime): ev = miutil.date2num(k.stop) eidx = self.dims[i].getValueIndex(ev) else: eidx = self.dimlen(i) if k.stop is None else k.stop if eidx < 0: eidx = self.dimlen(i) + eidx eidx -= 1 if isinstance(k.step, basestring): nv = float(k.step) + self.dims[i].getDimValue()[0] nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx elif isinstance(k.step, datetime.timedelta): nv = miutil.date2num(k.start + k.step) nidx = self.dims[i].getValueIndex(nv) step = nidx - sidx else: step = 1 if k.step is None else k.step if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx elif isinstance(k, list): onlyrange = False isrange = False if not isinstance(k[0], datetime.datetime): ranges.append(k) else: tlist = [] for tt in k: sv = miutil.date2num(tt) idx = self.dims[i].getValueIndex(sv) tlist.append(idx) ranges.append(tlist) k = tlist elif isinstance(k, basestring): dim = self.variable.getDimension(i) kvalues = k.split(':') sv = float(kvalues[0]) sidx = dim.getValueIndex(sv) if len(kvalues) == 1: eidx = sidx step = 1 else: ev = float(kvalues[1]) eidx = dim.getValueIndex(ev) if len(kvalues) == 2: step = 1 else: step = int(float(kvalues[2]) / dim.getDeltaValue()) if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx else: print k return None if isrange: if eidx >= dimlen: print 'Index out of range!' return None origin.append(sidx) n = eidx - sidx + 1 size.append(n) if n > 1: dim = self.variable.getDimension(i) if dim.isReverse(): step = -step dim = dim.extract(sidx, eidx, step) dim.setReverse(False) dims.append(dim) stride.append(step) if step < 0: step = abs(step) flips.append(i) rr = Range(sidx, eidx, step) ranges.append(rr) else: if len(k) > 1: dim = self.variable.getDimension(i) dim = dim.extract(k) dim.setReverse(False) dims.append(dim) #rr = self.dataset.read(self.name, origin, size, stride).reduce() if onlyrange: rr = self.dataset.dataset.read(self.name, ranges) else: rr = self.dataset.dataset.take(self.name, ranges) if rr.getSize() == 1: return rr.getObject(0) else: for i in flips: rr = rr.flip(i) rr = rr.reduce() ArrayMath.missingToNaN(rr, self.fill_value) if len(flips) > 0: rrr = Array.factory(rr.getDataType(), rr.getShape()) MAMath.copy(rrr, rr) array = MIArray(rrr) else: array = MIArray(rr) data = DimArray(array, dims, self.fill_value, self.dataset.proj) return data
def __getitem__(self, indices): if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' return None k = indices[0] if isinstance(k, int): sidx = k eidx = k step = 1 elif isinstance(k, slice): sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.tnum + sidx eidx = self.tnum if k.stop is None else k.stop if eidx < 0: eidx = self.tnum + eidx eidx -= 1 step = 1 if k.step is None else k.step elif isinstance(k, list): sidx = self.dataset.timeindex(k[0]) if len(k) == 1: eidx = sidx step = 1 else: eidx = self.dataset.timeindex(k[1]) if len(k) == 3: tt = self.dataset.timeindex(k[0] + k[3]) step = tt - sidx else: step = 1 sfidx = self.dataset.datafileindex(sidx) si = sidx isfirst = True times = [] fidx = sfidx aa = None var = None for i in range(sidx, eidx + 1, step): times.append(miutil.date2num(self.dataset.gettime(i))) fidx = self.dataset.datafileindex(i) if fidx > sfidx: ei = i - step ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(si) ii, eei = self.dataset.dftindex(ei) eei += 1 nindices = list(indices) nindices[0] = slice(ssi, eei, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) if si == ei: aa.addtdim(self.dataset.gettime(si)) if isfirst: data = aa isfirst = False else: data = minum.concatenate([data, aa]) si = i sfidx = fidx if si < eidx + 1: ei = eidx + 1 - step ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(si) ii, eei = self.dataset.dftindex(ei) eei += 1 nindices = list(indices) nindices[0] = slice(ssi, eei, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) if si == ei and eidx != sidx: aa.addtdim(self.dataset.gettime(si)) if isfirst: data = aa isfirst = False else: data = minum.concatenate([data, aa]) if aa is None: sfidx = self.dataset.datafileindex(sidx) ddf = self.dataset[sfidx] var = ddf[self.name] ii, ssi = self.dataset.dftindex(sidx) nindices = list(indices) nindices[0] = slice(ssi, ssi, step) nindices = tuple(nindices) aa = var.__getitem__(nindices) return aa if isinstance(data, DimArray): return data else: dims = aa.dims dims[0].setDimValues(times) r = DimArray(data, dims, aa.fill_value, aa.proj) return r
def __getitem__(self, indices): #print type(indices) if not isinstance(indices, tuple): inds = [] inds.append(indices) indices = inds if len(indices) != self.ndim: print 'indices must be ' + str(self.ndim) + ' dimensions!' raise IndexError() if not self.proj is None and not self.proj.isLonLat(): xlim = None ylim = None xidx = -1 yidx = -1 for i in range(0, self.ndim): dim = self.dims[i] if dim.getDimType() == DimensionType.X: k = indices[i] #if isinstance(k, (tuple, list)): if isinstance(k, basestring): xlims = k.split(':') xlim = [float(xlims[0]), float(xlims[1])] xidx = i elif dim.getDimType() == DimensionType.Y: k = indices[i] #if isinstance(k, (tuple, list)): if isinstance(k, basestring): ylims = k.split(':') ylim = [float(ylims[0]), float(ylims[1])] yidx = i if not xlim is None and not ylim is None: fromproj=KnownCoordinateSystems.geographic.world.WGS1984 inpt = PointD(xlim[0], ylim[0]) outpt1 = Reproject.reprojectPoint(inpt, fromproj, self.proj) inpt = PointD(xlim[1], ylim[1]) outpt2 = Reproject.reprojectPoint(inpt, fromproj, self.proj) xlim = [outpt1.X, outpt2.X] ylim = [outpt1.Y, outpt2.Y] indices1 = [] for i in range(0, self.ndim): if i == xidx: #indices1.append(xlim indices1.append(str(xlim[0]) + ':' + str(xlim[1])) elif i == yidx: #indices1.append(ylim) indices1.append(str(ylim[0]) + ':' + str(ylim[1])) else: indices1.append(indices[i]) indices = indices1 #origin = [] #size = [] #stride = [] dims = [] ranges = [] flips = [] iszerodim = True onlyrange = True for i in range(0, self.ndim): isrange = True k = indices[i] if isinstance(k, int): if k < 0: k = self.dims[i].getLength() + k sidx = k eidx = k step = 1 elif isinstance(k, slice): sidx = 0 if k.start is None else k.start if sidx < 0: sidx = self.dims[i].getLength() + sidx eidx = self.dims[i].getLength()-1 if k.stop is None else k.stop-1 if eidx < 0: eidx = self.dims[i].getLength() + eidx step = 1 if k.step is None else k.step elif isinstance(k, list): if not isinstance(k[0], datetime.datetime): onlyrange = False isrange = False ranges.append(k) else: sv = k[0] sv = miutil.date2num(sv) dim = self.dims[i] sidx = dim.getValueIndex(sv) if len(k) == 1: eidx = sidx step = 1 else: ev = k[1] ev = miutil.date2num(ev) eidx = dim.getValueIndex(ev) if len(k) == 2: step = 1 else: nv = k[2] nv = miutil.date2num(k[0] + k[2]) - sv step = int(nv / dim.getDeltaValue()) if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx elif isinstance(k, basestring): dim = self.dims[i] kvalues = k.split(':') sidx = dim.getValueIndex(float(kvalues[0])) if len(kvalues) == 1: eidx = sidx step = 1 else: eidx = dim.getValueIndex(float(kvalues[1])) if len(kvalues) == 2: step = 1 else: step = int(float(kvalues[2]) / dim.getDeltaValue()) if sidx > eidx: iidx = eidx eidx = sidx sidx = iidx else: print k raise IndexError() if isrange: if sidx >= self.shape[i]: raise IndexError() if sidx != eidx: iszerodim = False if step < 0: step = abs(step) flips.append(i) rr = Range(sidx, eidx, step) ranges.append(rr) #origin.append(sidx) n = eidx - sidx + 1 #size.append(n) #stride.append(step) if n > 1: dim = self.dims[i] dims.append(dim.extract(sidx, eidx, step)) else: if len(k) > 1: dim = self.dims[i] dims.append(dim.extract(k)) #r = ArrayMath.section(self.array.array, origin, size, stride) if onlyrange: r = ArrayMath.section(self.array.array, ranges) else: r = ArrayMath.take(self.array.array, ranges) if r.getSize() == 1: return r.getObject(0) else: for i in flips: r = r.flip(i) rr = Array.factory(r.getDataType(), r.getShape()); MAMath.copy(rr, r); array = MIArray(rr) data = DimArray(array, dims, self.fill_value, self.proj) return data