Add .into_view/_mut() methods to Windows, ExactChunks, and ExactChunksMut
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
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
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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rust-ndarray/ndarray
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
rust-ndarray/ndarray#1612 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1617 · 1 comment ·
-
bug good first issue
Difficulty 3/5 1-2 days Newbie friendliness 68/100
rust-ndarray/ndarray#1615 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1610 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 72/100
rust-ndarray/ndarray#1609 ·
All issues in rust-ndarray/ndarray
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
enhancement remote
Difficulty 2/5 1-3 hours Newbie friendliness 68/100