如何将Rust中的Vec转换为ndarray?新手求高效实现方法
将Rust的Vec转换为ndarray的高效方法
你不需要用循环逐个赋值,ndarray提供了直接且高效的转换方式,而且是零拷贝(直接复用Vec的底层内存,性能拉满),以下是具体用法:
1. 转换为一维数组(最常用)
Array1::from_vec 是转换一维Vec的最优方式,它会直接接管Vec的内存,不需要复制元素:
use ndarray::Array1; // 假设A已经填充好数据 let mut A: Vec<f32> = vec![1.0, 2.0, 3.0]; let B: Array1<f32> = Array1::from_vec(A);
也可以用通用的Array::from_vec,类型会自动推导为一维数组:
use ndarray::Array; let B = Array::from_vec(A);
2. 转换为多维数组
如果需要将Vec转换为多维数组(比如2x3的二维数组),可以用Array::from_shape_vec,需要指定目标维度,注意维度的元素总数要和Vec的长度匹配:
use ndarray::Array; let mut A: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; // 转换为2行3列的二维数组,返回Result,需要处理错误 let B = Array::from_shape_vec((2, 3), A).unwrap();
关于array!宏的说明
你之前尝试的array!(A)用法不对,这个宏是用来直接初始化数组元素的,比如:
use ndarray::array; // 直接创建一维数组 let B = array![1.0f32, 2.0, 3.0]; // 创建二维数组 let B = array![[1.0, 2.0], [3.0, 4.0]];
它不适合用来转换已有的Vec。
内容的提问来源于stack exchange,提问作者Dak
相关产品推荐
相关产品推荐

