You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:31:51