[Numpy-discussion] Add sliding_window_view method to numpy

Zimmermann Klaus klaus.zimmermann at smhi.se
Tue Oct 13 05:19:06 EDT 2020


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 <sebastian at sipsolutions.net
>> <mailto:sebastian at 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 at python.org <mailto:NumPy-Discussion at python.org>
>>> https://mail.python.org/mailman/listinfo/numpy-discussion
>>> <https://mail.python.org/mailman/listinfo/numpy-discussion>
>>>
>>
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at python.org <mailto:NumPy-Discussion at python.org>
>> https://mail.python.org/mailman/listinfo/numpy-discussion
>> <https://mail.python.org/mailman/listinfo/numpy-discussion>
> 
> 
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at python.org
> https://mail.python.org/mailman/listinfo/numpy-discussion
> 


More information about the NumPy-Discussion mailing list