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_view<https://16171-908607-gh.circle-artifacts.com/0/doc/build/html/reference/generated/numpy.sliding_window_view.html#numpy-sliding-window-view> > > > |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/generated/numpy.sliding_window_view.html#numpy.sliding_window_view> > > 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/generated/numpy.lib.stride_tricks.as_strided.html#numpy.lib.stride_tricks.as_strided> > > 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/generated/numpy.broadcast_to.html#numpy.broadcast_to> > > 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.fftconvolve.html#scipy.signal.fftconvolve>, > 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 > _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion