Hi, thanks, Juan, you are very kind!
Let's hope we can get this in soon :) Cheers Klaus On 13/10/2020 01:18, Juan Nunez-Iglesias wrote: > Looks gorgeous, thank you to all who worked on the implementation, API, > and review, and thank you Sebastian for saving me a click! 😂 > >> On 13 Oct 2020, at 2:25 am, Sebastian Berg <sebast...@sipsolutions.net >> <mailto:sebast...@sipsolutions.net>> 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 <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