没有从未装箱的切片创建NDArray的复制方法



我正在为使用Neon的Electron应用程序编写一个Rust插件。Javascript代码传递给我一个图像——一个由4元素像素(RGBA(的行和列组成的3D阵列。因为在编译时,行数和列数是未知的,所以我想为传递的图像创建一个NDArray(可能是像素的2D阵列,而不是字节的3D阵列(。

但是,我不想复制图像。它的大小是兆字节,而且这种情况每秒发生很多次,所以复制效率很低。

我想我明白了如果图像被装箱的话该怎么做了——比如这样的:

let vec = boxed_image.into_vec(??);
let array = Array::from_shape_vec((rows, cols), vec);
...
let vec = array.into_raw_vec();
let ptr = vec.leak();

但是这个数组属于Javascript代码;我可以看看它,但我没有它。而且它不是Rust分配的,所以它不是Boxed。

有没有一种方法可以从未装箱的切片创建NDArray?或者有更好的方法来破解这个难题吗?

假设您从Javascript中获得一个字节切片,那么您应该能够使用ndarray::ArrayView来创建一个借用的数据视图:

https://docs.rs/ndarray/0.15.1/ndarray/type.ArrayView.html#impl

// copied from https://docs.rs/ndarray/0.15.1/ndarray/type.ArrayView.html#impl
use ndarray::ArrayView;
use ndarray::arr3;
use ndarray::ShapeBuilder;
// advanced example where we are even specifying exact strides to use (which is optional).
let s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
let a = ArrayView::from_shape((2, 3, 2).strides((1, 4, 2)),
&s).unwrap();
assert!(
a == arr3(&[[[0, 2],
[4, 6],
[8, 10]],
[[1, 3],
[5, 7],
[9, 11]]])
);
assert!(a.strides() == &[1, 4, 2]);

当然,只有当您不需要拥有数据时,这才有效,这在很大程度上是不创建副本所暗示的。

最新更新