【问题标题】:How to convert ndarray::ArrayView to &ndarray::Array without copying?如何在不复制的情况下将 ndarray::ArrayView 转换为 &ndarray::Array?
【发布时间】:2020-02-22 11:47:41
【问题描述】:

我正在使用 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 就不能拥有 &amp;T。如果不保留对基础数据的所有权,显然无法创建Array2&lt;u8&gt;。我自欺欺人地认为这应该是可能的,因为 ArrayView&amp;Array 都不拥有数据。

【问题讨论】:

  • 很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在 Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在 edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!

标签: multidimensional-array rust borrowing


【解决方案1】:

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

但是,您可以反过来做:您可以让 use_array 获取 ArrayView2&lt;u8&gt;(如果它不是您依赖的某些外部代码的一部分),然后更改之前调用 use_array 的任何调用对use_array(your_array2.view()) 的完整二维数组引用。

【讨论】:

  • 实际上我试图实现的是获得“假”&amp;Array2d&lt;u8&gt;,它仅引用ArrayView2&lt;u8&gt; 指向的原始数组的一部分。这很愚蠢。
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2013-08-14
  • 1970-01-01
  • 2021-08-09
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
相关资源
最近更新 更多