Hi, thanks, Sebastian! Since `sliding_window_view` is essentially a small function determining the parameters with which to call `as_strided`, it makes sense to me to keep the essential `as_strided` parameters, `subok` among them. But if somebody with a deeper insight into numpy is convinced this should go, I have no problem with it. Cheers Klaus On 12/10/2020 17:25, Sebastian Berg wrote:
On Mon, 2020-10-12 at 08:39 +0000, Zimmermann Klaus wrote:
Hello,
I would like to draw the attention of this list to PR #17394 [1] that adds the implementation of a sliding window view to numpy.
Hi,
thanks for working on this and driving going forward. I like the choice of a minimal API. I have pasted the doc-string (html, hope that works fine) below to allow a quicker idea of what is being proposed. To me it looks good! (I wonder if we need `subok`, but I guess we probably do.)
Cheers,
Sebastian
numpy.sliding_window_viewhttps://16171-908607-gh.circle-artifacts.com/0/doc/build/html/reference/gene...
|numpy.||sliding_window_view|(/x/, /window_shape/, /axis=None/, /*/, /subok=False/, /writeable=False/)https://16171-908607-gh.circle-artifacts.com/0/doc/build/html/reference/gene...
Create a sliding window view into the array with the given window shape.
Creates a sliding window view of the N dimensional array with the given window shape. Window slides across each dimension of the array and extract a subsets of the array at any window position.
Parameters
x : array_like
Array to create the sliding window view from.
window_shape : int or tuple of int
Size of window over each axis that takes part in the sliding window. If /axis/ is not present, must have same length as the number of input array dimensions. Single integers /i/ are treated as if they were the tuple /(i,)/.
axis : int or tuple of int, optional
Axis or axes along which the sliding window is applied. By default, the sliding window is applied to all axes and /window_shape[i]/ will refer to axis /i/ of /x/. If /axis/ is given as a /tuple of int/, /window_shape[i]/ will refer to the axis /axis[i]/ of /x/. Single integers /i/ are treated as if they were the tuple /(i,)/.
subok : bool, optional
If True, sub-classes will be passed-through, otherwise the returned array will be forced to be a base-class array (default).
writeable : bool, optional
When true, allow writing to the returned view. The default is false, as this should be used with caution: the returned view contains the same memory location multiple times, so writing to one location will cause others to change.
Returns
view : ndarray
Sliding window view of the array. The sliding window dimensions are inserted at the end, and the original dimensions are trimmed as required by the size of the sliding window.
That is, |view.shape = x_shape_trimmed + window_shape|, where |x_shape_trimmed| is |x.shape| with every entry reduced by one less than the corresponding window size.
See also
|lib.stride_tricks.as_strided| https://16171-908607-gh.circle-artifacts.com/0/doc/build/html/reference/gene...
Create a view into the array with the given shape and strides.
|broadcast_to| https://16171-908607-gh.circle-artifacts.com/0/doc/build/html/reference/gene...
broadcast an array to a given shape.
Notes
For some cases there may be more efficient approaches to calculate transformations across multi-dimensional arrays, for instance |scipy.signal.fftconvolve| https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolv..., where combining the iterating step with the calculation itself while storing partial results can result in significant speedups.
Examples
>>> x = np.arange(6) >>> x.shape (6,) >>> v = np.sliding_window_view(x, 3) >>> v.shape (4, 3) >>> v array([[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]])
This also works in more dimensions, e.g.
>>> i, j = np.ogrid[:3, :4] >>> x = 10*i + j >>> x.shape (3, 4) >>> x array([[ 0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]]) >>> shape = (2,2) >>> v = np.sliding_window_view(x, shape) >>> v.shape (2, 3, 2, 2) >>> v array([[[[ 0, 1], [10, 11]], [[ 1, 2], [11, 12]], [[ 2, 3], [12, 13]]], [[[10, 11], [20, 21]], [[11, 12], [21, 22]], [[12, 13], [22, 23]]]])
The axis can be specified explicitly:
>>> v = np.sliding_window_view(x, 3, 0) >>> v.shape (1, 4, 3) >>> v array([[[ 0, 10, 20], [ 1, 11, 21], [ 2, 12, 22], [ 3, 13, 23]]])
The same axis can be used several times. In that case, every use reduces the corresponding original dimension:
>>> v = np.sliding_window_view(x, (2, 3), (1, 1)) >>> v.shape (3, 1, 2, 3) >>> v array([[[[ 0, 1, 2], [ 1, 2, 3]]], [[[10, 11, 12], [11, 12, 13]]], [[[20, 21, 22], [21, 22, 23]]]])
Combining with stepped slicing (/::step/), this can be used to take sliding views which skip elements:
>>> x = np.arange(7) >>> np.sliding_window_view(x, 5)[:, ::2] array([[0, 2, 4], [1, 3, 5], [2, 4, 6]])
or views which move by multiple elements
>>> x = np.arange(7) >>> np.sliding_window_view(x, 3)[::2, :] array([[0, 1, 2], [2, 3, 4], [4, 5, 6]])
Having a sliding window view in numpy is a longstanding open issue (cf #7753 [2] from 2016). A brief summary of the discussions surrounding it can be found in the description of the PR.
This PR implements a sliding window view based on stride tricks. Following the discussion in issue #7753, a first implementation was provided by Fanjin Zeng in PR #10771. After some discussion, that PR stalled and I picked up the issue in the present PR #17394. It is based on the first implementation, but follows the changed API as suggested by Eric Wieser.
Code reviews have been provided by Bas van Beek, Stephen Hoyer, and Eric Wieser. Sebastian Berg added the "62 - Python API" label.
Do you think this is suitable for inclusion in numpy?
Do you consider the PR ready?
Do you have suggestions or requests?
Thanks for your time and consideration! Klaus
[1] https://github.com/numpy/numpy/pull/17394 https://github.com/numpy/numpy/pull/17394 [2] https://github.com/numpy/numpy/issues/7753 https://github.com/numpy/numpy/issues/7753 _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org mailto:NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion https://mail.python.org/mailman/listinfo/numpy-discussion
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion