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

如何在Rust中基于布尔向量构造并条件赋值新向量

在Rust中实现类似NumPy的布尔索引赋值操作

方法一:使用标准库(无额外依赖)

直接利用Rust标准库的向量与迭代器功能,手动完成布尔索引的赋值逻辑,适合不需要第三方库的场景:

fn main() {
    let n = 5;
    // 初始化长度为n、填充NaN的f64向量
    let mut a = vec![f64::NAN; n];
    let b = [true, false, true, false, false];
    let c = [1.1, 5.3];

    // 遍历布尔向量,同时迭代c的元素,为对应位置赋值
    let mut c_iter = c.iter();
    for (idx, &should_assign) in b.iter().enumerate() {
        if should_assign {
            if let Some(&val) = c_iter.next() {
                a[idx] = val;
            }
        }
    }

    println!("{:?}", a); // 输出: [1.1, NaN, 5.3, NaN, NaN]
}

说明:

  • 时间复杂度O(N),仅需一次遍历即可完成赋值,效率很高;
  • 需确保c的长度与b中true的数量匹配,否则未匹配到的true位置会保留NaN,c的剩余元素会被忽略;
  • 可添加长度检查避免意外情况,比如在赋值前加入:
    assert_eq!(
        c.len(),
        b.iter().filter(|&&x| x).count(),
        "c的长度必须与b中true的数量一致"
    );
    

方法二:使用ndarray库(贴近NumPy风格)

如果习惯NumPy的数组操作风格,可以使用Rust生态中的ndarray库,它提供了类似NumPy的布尔索引功能,代码更简洁:

首先在Cargo.toml中添加依赖:

[dependencies]
ndarray = "0.15"

然后编写代码:

use ndarray::{Array1, arr1};

fn main() {
    let n = 5;
    // 初始化填充NaN的一维数组
    let mut a = Array1::from_elem(n, f64::NAN);
    let b = arr1(&[true, false, true, false, false]);
    let c = arr1(&[1.1, 5.3]);

    // 布尔索引赋值,与NumPy写法高度一致
    a.slice_mut(b).assign(&c);

    println!("{:?}", a); // 输出: [1.1, NaN, 5.3, NaN, NaN]
}

说明:

  • ndarray内部做了性能优化,效率不亚于手动迭代;
  • 若c的长度与b中true的数量不匹配,会直接panic,建议提前做长度检查;
  • 适合处理更复杂的多维数组操作,生态成熟,能覆盖大部分NumPy的常用场景。

内容的提问来源于stack exchange,提问作者lebesgue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:24