Source code for scatseisnet.operation
"""Miscellaneous operations for scatseisnet.
This module contains miscellaneous operations for scatseisnet, such as
segmentation and pooling.
.. dropdown:: Terms of use
.. code-block:: text
Copyright (C) 2021 Léonard Seydoux.
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import typing as T
import numpy as np
[docs]
def segment(
x: np.ndarray,
window_size: int,
stride: T.Union[int, None] = None,
) -> T.Generator[np.ndarray, None, None]:
"""Segment array into overlapping windows.
Arguments
---------
x: :class:`numpy.ndarray`
Array to segment.
window_size: int
Sliding window size in numpy of points
stride: int, optional
Sliding window stride in numpy of points. If None, stride is equal to
window_size.
Yields
------
The elements of the segmented array.
"""
bins = x.shape[-1]
index = 0
stride = window_size if stride is None else stride
while (index + window_size) <= bins:
yield x[..., index : index + window_size]
index += stride
[docs]
def segmentize(
x: np.ndarray,
window_size: int,
stride: T.Union[int, None] = None,
) -> np.ndarray:
"""Segment array into overlapping windows.
Arguments
---------
x: :class:`numpy.ndarray`
Array to segment.
window_size: int
Sliding window size in numpy of points
stride: int, optional
Sliding window stride in numpy of points. If None, stride is equal to
window_size.
Returns
-------
The segmented array with shape ``(n_windows, n_channels, n_times)``.
"""
return np.array([x for x in segment(x, window_size, stride)])
[docs]
def pool(
x: np.ndarray,
reduce_type: T.Union[T.Callable, None] = None,
) -> np.ndarray:
"""Pooling operation performed on the last axis.
Arguments
---------
x: :class:`numpy.ndarray`
The input data to pool.
reduce_type: callable, optional
The reducing operation (e.g. :func:`numpy.mean()`). If None, no
operation is performed.
Returns
-------
pooled: :class:`numpy.ndarray`
The data pooled with same shape of input data minus last dimension.
"""
if reduce_type is None:
return x
else:
return reduce_type(x, axis=-1)