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