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

Abierto
#920 2 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Nueva funcionalidad
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
rust
Área
data

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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) }
    }
}
Lenguaje dominante
Rust
Estrellas
4.3k
Forks
391
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de rust-ndarray/ndarray

Todos los issues de rust-ndarray/ndarray

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.