Exemplo n.º 1
0
 def get_between(self, dim, lower, upper):
     pos = self._axis_map[dim]
     ref = getattr(self, dim)
     _, indices = ref.get_between(lower, upper, return_indices=True)
     slc = get_reduced_slice(indices)
     slc_field = [slice(None)] * 5
     slc_field[pos] = slc
     ret = self[slc_field]
     return ret
Exemplo n.º 2
0
 def get_between(self,dim,lower,upper):
     pos = self._axis_map[dim]
     ref = getattr(self,dim)
     ## TODO: minor redundancy in slicing and returning dimension
     new_dim,indices = ref.get_between(lower,upper,return_indices=True)
     slc = get_reduced_slice(indices)
     slc_field = [slice(None)]*5
     slc_field[pos] = slc
     ret = self[slc_field]
     return(ret)
Exemplo n.º 3
0
    def get_subset_bbox(self,min_col,min_row,max_col,max_row,return_indices=False,closed=True):
        assert(min_row <= max_row)
        assert(min_col <= max_col)
        
        if self.row is None:
            r_row = self.value[0,:,:]
            real_idx_row = np.arange(0,r_row.shape[0])
            r_col = self.value[1,:,:]
            real_idx_col = np.arange(0,r_col.shape[1])
            
            if closed:
                lower_row = r_row > min_row
                upper_row = r_row < max_row
                lower_col = r_col > min_col
                upper_col = r_col < max_col
            else:
                lower_row = r_row >= min_row
                upper_row = r_row <= max_row
                lower_col = r_col >= min_col
                upper_col = r_col <= max_col
            
            idx_row = np.logical_and(lower_row,upper_row)
            idx_col = np.logical_and(lower_col,upper_col)
            
            keep_row = np.any(idx_row,axis=1)
            keep_col = np.any(idx_col,axis=0)
            
            row_slc = get_reduced_slice(real_idx_row[keep_row])
            col_slc = get_reduced_slice(real_idx_col[keep_col])
            
            new_mask = np.invert(np.logical_or(idx_row,idx_col)[row_slc,col_slc])
            
#            import ipdb;ipdb.set_trace()
#            idx_row_start = None
#            idx_row_stop = None
#            for ii in range(idx_row.shape[0]):
#                if not idx_row[ii,:].any():
#                    continue
#                else:
#                    if idx_row_start is None:
#                        idx_row_start = ii
#            import ipdb;ipdb.set_trace()
#                
#            ## if all data is returned the indices are equivalent to the size
#            ## of the array.
#            if not r_value_mask.any():
#                row_slc = slice(0,r_value.shape[1])
#                col_slc = slice(0,r_value.shape[2])
#            else:
#                import ipdb;ipdb.set_trace()
        else:
            new_row,row_indices = self.row.get_between(min_row,max_row,return_indices=True,closed=closed)
            new_col,col_indices = self.col.get_between(min_col,max_col,return_indices=True,closed=closed)
            row_slc = get_reduced_slice(row_indices)
            col_slc = get_reduced_slice(col_indices)
            
#        new_uid = self.uid[row_slc,col_slc]
#            
#        if self._value is None:
#            new_value = None
#        else:
#            new_value = self._value[:,row_slc,col_slc]
#        
#        ret = copy(self)
#        ret._value = new_value
#        ret.row = new_row
#        ret.col = new_col
#        ret.uid = new_uid
        
        ret = self[row_slc,col_slc]
        
        try:
            ret._value.mask = new_mask
        except UnboundLocalError:
            if self.row is not None:
                pass
            else:
                raise
            
        if return_indices:
            ret = (ret,(row_slc,col_slc))
            
        return(ret)
Exemplo n.º 4
0
    def get_subset_bbox(self,min_col,min_row,max_col,max_row,return_indices=False,closed=True,
                        use_bounds=True):
        assert(min_row <= max_row)
        assert(min_col <= max_col)
        
        if self.row is None:
            r_row = self.value[0,:,:]
            real_idx_row = np.arange(0,r_row.shape[0])
            r_col = self.value[1,:,:]
            real_idx_col = np.arange(0,r_col.shape[1])
            
            if closed:
                lower_row = r_row > min_row
                upper_row = r_row < max_row
                lower_col = r_col > min_col
                upper_col = r_col < max_col
            else:
                lower_row = r_row >= min_row
                upper_row = r_row <= max_row
                lower_col = r_col >= min_col
                upper_col = r_col <= max_col
            
            idx_row = np.logical_and(lower_row,upper_row)
            idx_col = np.logical_and(lower_col,upper_col)
            
            keep_row = np.any(idx_row,axis=1)
            keep_col = np.any(idx_col,axis=0)
            
            ## slice reduction may fail due to empty bounding box returns. catch
            ## these value errors and repurpose as subset errors.
            try:
                row_slc = get_reduced_slice(real_idx_row[keep_row])
            except ValueError:
                if real_idx_row[keep_row].shape[0] == 0:
                    raise(EmptySubsetError(origin='Y'))
                else:
                    raise
            try:
                col_slc = get_reduced_slice(real_idx_col[keep_col])
            except ValueError:
                if real_idx_col[keep_col].shape[0] == 0:
                    raise(EmptySubsetError(origin='X'))
                else:
                    raise
            
            new_mask = np.invert(np.logical_or(idx_row,idx_col)[row_slc,col_slc])
            
        else:
            new_row,row_indices = self.row.get_between(min_row,max_row,return_indices=True,closed=closed,use_bounds=use_bounds)
            new_col,col_indices = self.col.get_between(min_col,max_col,return_indices=True,closed=closed,use_bounds=use_bounds)
            row_slc = get_reduced_slice(row_indices)
            col_slc = get_reduced_slice(col_indices)
        
        ret = self[row_slc,col_slc]
        
        try:
            grid_mask = np.zeros((2,new_mask.shape[0],new_mask.shape[1]),dtype=bool)
            grid_mask[:,:,:] = new_mask
            ret._value = np.ma.array(ret._value,mask=grid_mask)
            ret.uid = np.ma.array(ret.uid,mask=new_mask)
        except UnboundLocalError:
            if self.row is not None:
                pass
            else:
                raise

        if return_indices:
            ret = (ret,(row_slc,col_slc))

        return(ret)