Rust测试:如何创建非连续内存的ndarray::ArrayBase向量?
创建非连续内存的
ndarray::ArrayBase向量的实用方法 针对单元测试中验证is_standard_layout()的需求,以下几种方法可以高效创建非连续内存布局的向量:
1. 对连续数组做间隔切片
这是最简洁的方式,通过指定步长不为1的切片规则,直接从连续数组中提取非连续元素,生成的子数组自然不满足标准布局:
use ndarray::Array1; #[test] fn test_non_continuous_slice() { let continuous_arr = Array1::from(vec![1.0, 2.0, 3.0, 4.0, 5.0]); // 取索引0、2、4的元素,步长为2 let non_continuous = continuous_arr.slice(s![0..;2]); assert!(!non_continuous.is_standard_layout()); }
2. 利用二维数组转置生成非连续行/列
将一维数组重塑为二维结构,转置后提取的行(原数组的列)在内存中是非连续的,适合模拟真实矩阵操作后的非连续场景:
use ndarray::{Array1, Array2}; #[test] fn test_non_continuous_transpose() { let continuous_arr = Array1::from(vec![1.0, 2.0, 3.0, 4.0]); // 转换为2x2的二维数组 let arr_2d = continuous_arr.into_shape((2, 2)).unwrap(); // 转置后取第一行,对应原二维数组的第一列,内存不连续 let non_continuous = arr_2d.t().row(0); assert!(!non_continuous.is_standard_layout()); }
3. 手动指定步长构造非连续数组
通过with_strides()方法直接修改数组的内存步长,精确控制布局,适合需要自定义非连续规则的场景:
use ndarray::{Array1, ShapeError}; #[test] fn test_non_continuous_custom_strides() -> Result<(), ShapeError> { let data = vec![1.0, 2.0, 3.0, 4.0]; // 创建形状为3的数组,步长设为2,跳过索引1、3的元素 let non_continuous = Array1::from_shape_vec((3,), data)? .with_strides([2]); assert!(!non_continuous.is_standard_layout()); Ok(()) }
方法选择建议
- 优先用切片法:代码简洁,单元测试中足够覆盖大部分验证场景。
- 转置法适合模拟真实业务中的非连续情况,测试更贴近实际使用场景。
- 手动步长法适合需要特殊非连续布局的测试用例。
内容的提问来源于stack exchange,提问作者stackoverflowing321
相关产品推荐
相关产品推荐

