如何在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
相关产品推荐
相关产品推荐

