def isel(self, indexers: Mapping[Axes, Union[int, tuple]]): """Given a dictionary mapping the index name to either a value or a range represented as a tuple, return an Imagestack with each dimension indexed by position accordingly Parameters ---------- indexers : Dict[Axes, (int/tuple)] A dictionary of dim:index where index is the value or range to index the dimension Examples -------- Create an Imagestack using the ``synthetic_stack`` method >>> from starfish import ImageStack >>> from starfish.types import Axes >>> stack = ImageStack.synthetic_stack(5, 5, 15, 200, 200) >>> stack <starfish.ImageStack (r: 5, c: 5, z: 15, y: 200, x: 200)> >>> stack.isel({Axes.ROUND: (1, None), Axes.CH: 0, Axes.ZPLANE: 0}) <starfish.ImageStack (r: 4, c: 1, z: 1, y: 200, x: 200)> >>> stack.isel({Axes.ROUND: 0, Axes.CH: 0, Axes.ZPLANE: 1, ...Axes.Y: 100, Axes.X: (None, 100)}) <starfish.ImageStack (r: 1, c: 1, z: 1, y: 1, x: 100)> and the imagestack's physical coordinates xarray also indexed and recalculated according to the x,y slicing. Returns ------- ImageStack : a new image stack indexed by given value or range. """ stack = deepcopy(self) selector = indexing_utils.convert_to_selector(indexers) stack._data._data = indexing_utils.index_keep_dimensions(self.xarray, selector, by_pos=True) return stack
def get_partial(self, indexers: Mapping[Axes, Union[int, slice, Sequence]]): """ Slice the codebook data according to the provided indexing parameters. Used in a composite codebook scenario. Parameters ---------- indexers : Mapping[Axes, Union[int, Sequence]] A dictionary of dim:index where index is the value, values or range to index the dimension """ selector = indexing_utils.convert_to_selector(indexers) return indexing_utils.index_keep_dimensions(self, indexers=selector)
def sel(self, indexers: Mapping[Axes, Union[int, slice, Sequence]]): """Given a dictionary mapping the index name to either a value or a range represented as a tuple, return an Imagestack with each dimension indexed accordingly Parameters ---------- indexers : Mapping[Axes, Union[int, Union[int, Sequence]] A dictionary of dim:index where index is the value, values, or range to index the dimension Examples -------- Create an Imagestack :py:func:`~starfish.imagestack.imagestack.ImageStack.synthetic_stack` >>> from starfish import ImageStack >>> from starfish.core.imagestack.test.factories import synthetic_stack >>> from starfish.types import Axes >>> stack = synthetic_stack(5, 5, 15, 200, 200) >>> stack <starfish.ImageStack (r: 5, c: 5, z: 15, y: 200, x: 200)> >>> stack.sel({Axes.ROUND: (1, None), Axes.CH: 0, Axes.ZPLANE: 0}) <starfish.ImageStack (r: 4, c: 1, z: 1, y: 200, x: 200)> >>> stack.sel({Axes.ROUND: 0, Axes.CH: 0, Axes.ZPLANE: 1, ...Axes.Y: 100, Axes.X: (None, 100)}) <starfish.ImageStack (r: 1, c: 1, z: 1, y: 1, x: 100)> and the imagestack's physical coordinates xarray also indexed and recalculated according to the x,y slicing. Returns ------- ImageStack : a new image stack indexed by given value or range. """ self._ensure_data_loaded() stack = deepcopy(self) selector = indexing_utils.convert_to_selector(indexers) stack._data = indexing_utils.index_keep_dimensions( self.xarray, selector) return stack
def get_slice( self, selector: Mapping[Axes, Union[int, slice]] ) -> Tuple[np.ndarray, Sequence[Axes]]: """ Given a dictionary mapping the index name to either a value or a slice range, return a numpy array representing the slice, and a list of the remaining axes beyond the normal x-y tile. Examples -------- Slicing with a scalar >>> from starfish import ImageStack >>> from starfish.core.imagestack.test.factories import synthetic_stack >>> from starfish.core.types import Axes >>> stack = synthetic_stack(3, 4, 5, 20, 10) >>> stack.shape OrderedDict([(<Axes.ROUND: 'r'>, 3), (<Axes.CH: 'c'>, 4), (<Axes.ZPLANE: 'z'>, 5), ('y', 20), ('x', 10)]) >>> stack.axis_labels(Axes.ROUND) [0, 1, 2] >>> stack.axis_labels(Axes.CH) [0, 1, 2, 3] >>> stack.axis_labels(Axes.ZPLANE) [2, 3, 4, 5, 6] >>> data, axes = stack.get_slice({Axes.ZPLANE: 6}) >>> data.shape (3, 4, 20, 10) >>> axes [<Axes.ROUND: 'r'>, <Axes.CH: 'c'>] Slicing with a range >>> from starfish import ImageStack >>> from starfish.core.imagestack.test.factories import synthetic_stack >>> from starfish.core.types import Axes >>> stack = synthetic_stack(3, 4, 5, 20, 10) >>> stack.shape OrderedDict([(<Axes.ROUND: 'r'>, 3), (<Axes.CH: 'c'>, 4), (<Axes.ZPLANE: 'z'>, 5), ('y', 20), ('x', 10)]) >>> stack.axis_labels(Axes.ROUND) [0, 1, 2] >>> stack.axis_labels(Axes.CH) [0, 1, 2, 3] >>> stack.axis_labels(Axes.ZPLANE) [2, 3, 4, 5, 6] >>> data, axes = stack.get_slice({Axes.ZPLANE: 5, Axes.CH: slice(2, 4)}) >>> data.shape (3, 2, 20, 10) >>> axes [<Axes.ROUND: 'r'>, <Axes.CH: 'c'>] """ formatted_indexers = indexing_utils.convert_to_selector(selector) _, axes = self._build_slice_list(selector) result = self._data.sel(formatted_indexers).values if result.dtype != np.float32: warnings.warn( f"Non-float32 dtype: {result.dtype} detected. Data has likely been set using " f"private attributes of ImageStack. ImageStack only supports float data in the " f"range [0, 1]. Many algorithms will not function properly if provided other " f"DataTypes. See: http://scikit-image.org/docs/dev/user_guide/data_types.html" ) return result, axes