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

How to convert ndarray::ArrayView to &ndarray::Array without copying?

我正在使用 ndarray crate,我有一个引用 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 都不拥有数据。

不,您无法获得 &Array2<u8>,因为 &Array2<u8> 始终是对完整二维数组的引用,而您的 layer 包含额外的元数据以识别正确的拥有的 Array2 部分可访问。

然而,你可以反过来做:你可以让 use_array 接受一个 ArrayView2<u8> (如果它不是你依赖的某些外部代码的一部分)然后改变任何调用以前称为 use_array,带有对 use_array(your_array2.view()).

的完整二维数组引用