Source code for planetary_coverage.misc.segment

"""Miscellaneous segment module."""

import numpy as np


[docs]class Segment: """Segments object on conditional list. Parameters ---------- arr: numpy.ndarray Conditional list. """ OUT = 0 IN = 1 START = 2 STOP = 3 SINGLE = 4 def __init__(self, arr): cond = np.array([False, *arr, False], dtype=np.int64) self.codes = np.max([ np.zeros_like(arr), 4 * cond[1:-1] - cond[:-2] - 2 * cond[2:] ], axis=0) def __repr__(self): return f'<{self.__class__.__name__}> {len(self)} ({len(self.codes)} npts)' def __len__(self): return int(np.sum(self.starts)) def __iter__(self): return iter(self.slices) @property def starts(self): """Get segment starts.""" return (self.codes == self.START) | self.singles @property def stops(self): """Get segment stops.""" return (self.codes == self.STOP) | self.singles @property def singles(self): """Get segment isolated single points.""" return self.codes == self.SINGLE @property def inside(self): """Get segment inside points.""" return (self.codes == self.IN) | self.starts | self.stops @property def outside(self): """Get segment outside points.""" return self.codes == self.OUT @property def istarts(self): """Segment starts indexes.""" return np.argwhere(self.starts).ravel() @property def istops(self): """Segment stops indexes.""" return np.argwhere(self.stops).ravel() @property def slices(self): """Segment slices.""" for i, j in zip(self.istarts, self.istops): yield slice(i, j + 1)