如何在不复制的情况下将 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())
.
的完整二维数组引用
我正在使用 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())
.