Esempio n. 1
0
 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) 
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
 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) 
Esempio n. 7
0
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
Esempio n. 8
0
 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
Esempio n. 9
0
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
Esempio n. 10
0
 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)
Esempio n. 11
0
 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)
Esempio n. 12
0
    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
Esempio n. 13
0
 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
Esempio n. 14
0
 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
Esempio n. 15
0
    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        
Esempio n. 16
0
 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
Esempio n. 17
0
 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
Esempio n. 18
0
 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