Add .into_view/_mut() methods to Windows, ExactChunks, and ExactChunksMut

Open
#920 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Feature
Clarity
Clearly specified
Activity status
Stale
Tech stack
rust
Domain
data

Research direction

Locate Windows, ExactChunks, ExactChunksMut, and the DimAdd trait from issue #570. Compare the proposed Windows::into_view implementation with the corresponding types, then add the requested immutable and mutable view methods; done means all three types support the requested conversions while preserving outer and window axes.

Written by the indexing model from the issue text.

Description

enhancement help wanted

This can be convenient for some use cases, such as copying windows (especially with a non-unit step between windows) into a new owned array for modification.

This would rely on the DimAdd trait from #570. For example, the implementation for Windows could be the following:

impl<'a, A, D: Dimension> Windows<'a, A, D> {
    /// Returns a view such that the outer axes are the iteration axes and the
    /// inner axes are the axes of the windows.
    ///
    /// # Example
    ///
    /// ```
    /// use ndarray::{array, aview2, s};
    ///
    /// let arr = array![
    ///     [0, 1, 2, 3],
    ///     [4, 5, 6, 7],
    ///     [8, 9, 10, 11],
    /// ];
    /// let windows = arr.windows([2, 3]).into_view();
    /// assert_eq!(windows.shape(), &[2, 2, 2, 3]);
    /// assert_eq!(
    ///     windows.slice(s![0, 0, .., ..]),
    ///     aview2(&[[0, 1, 2], [4, 5, 6]]),
    /// );
    /// assert_eq!(
    ///     windows.slice(s![0, 1, .., ..]),
    ///     aview2(&[[1, 2, 3], [5, 6, 7]]),
    /// );
    /// assert_eq!(
    ///     windows.slice(s![1, 0, .., ..]),
    ///     aview2(&[[4, 5, 6], [8, 9, 10]]),
    /// );
    /// assert_eq!(
    ///     windows.slice(s![1, 1, .., ..]),
    ///     aview2(&[[5, 6, 7], [9, 10, 11]]),
    /// );
    /// ```
    pub fn into_view(self) -> ArrayView<'a, A, <D as DimAdd<D>>::Output> {
        let base_ndim = self.base.ndim();
        let out_ndim = 2 * base_ndim; // check for overflow?
        let mut out_dim = <D as DimAdd<D>>::Output::zeros(out_ndim);
        out_dim.slice_mut()[..base_ndim].copy_from_slice(&self.base.dim.slice());
        out_dim.slice_mut()[base_ndim..].copy_from_slice(&self.window.slice());
        let mut out_strides = <D as DimAdd<D>>::Output::zeros(out_ndim);
        out_strides.slice_mut()[..base_ndim].copy_from_slice(&self.base.strides.slice());
        out_strides.slice_mut()[base_ndim..].copy_from_slice(&self.strides.slice());
        unsafe { self.base.with_strides_dim(out_strides, out_dim) }
    }
}
Dominant language
Rust
Stars
4.3k
Forks
391
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from rust-ndarray/ndarray

All issues in rust-ndarray/ndarray

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.