Source code for ezmsg.event.util.array
import sparse
[docs]
def sliding_win_oneaxis(
s: sparse.SparseArray, nwin: int, axis: int, step: int = 1
) -> sparse.SparseArray:
if -s.ndim <= axis < 0:
axis = s.ndim + axis
targ_slices = [slice(_, _ + nwin) for _ in range(0, s.shape[axis] - nwin + 1, step)]
s = s.reshape(s.shape[:axis] + (1,) + s.shape[axis:])
full_slices = (slice(None),) * s.ndim
full_slices = [
full_slices[: axis + 1] + (sl,) + full_slices[axis + 2 :] for sl in targ_slices
]
result = sparse.concatenate([s[_] for _ in full_slices], axis=axis)
# TODO: Profile this approach vs working with coords and values only.
return result