如何在不复制的情况下将ndarray :: ArrayView转换为&ndarray :: Array?

时间:2020-02-22 11:47:41

标签: multidimensional-array rust borrowing

我正在使用ndarray板条箱,并且有一个引用Array2的函数:

fn use_array(array: &Array2<u8>) {
    // ...
}

我正在尝试通过视图调用此函数:

image.axis_iter(Axis(2)).for_each(|layer| {
    fun(&layer.to_owned());
});

这会导致错误:

   |
92 |         fun(&layer);
   |             ^^^^^^ expected struct `ndarray::OwnedRepr`, found struct `ndarray::ViewRepr`
   |
error: could not compile `poisson-editing`.
warning: build failed, waiting for other jobs to finish...
   = note: expected type `&ndarray::ArrayBase<ndarray::OwnedRepr<u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`
              found type `&ndarray::ArrayBase<ndarray::ViewRepr<&u8>, ndarray::dimension::dim::Dim<[usize; 2]>>`

我可以通过拥有数组元素来解决它,但是随后我创建了不必要的数组副本。

image.axis_iter(Axis(2)).for_each(|layer| {
    use_array(&layer.to_owned());
});

有没有办法避免在这里复制?


更新:

现在我认为这是一个愚蠢的问题。无法进行此转换,因为如果不创建&T就无法拥有T。显然,如果不保留对基础数据的所有权,就无法创建Array2<u8>。我自欺欺人地认为应该可行,因为ArrayView&Array都不拥有数据。

1 个答案:

答案 0 :(得分:1)

否,您无法获得&Array2<u8>,因为&Array2<u8>始终是对完整2d数组的引用,而您的layer包含其他元数据来标识正确的2d数组拥有的Array2

但是,您可以采用另一种方法:使use_arrayArrayView2<u8>(如果它不是您依赖的某些外部代码的一部分),然后更改以前调用的任何调用use_array,其中包含对use_array(your_array2.view())的完整二维数组引用。