03
数据处理:ndarray 与 polars
ndarray & polars · NumPy & Pandas in Rust
AI 项目 80% 的时间在洗数据。Python 用 NumPy 和 Pandas,Rust 对应物是 ndarray(多维数组,对标 NumPy)和 polars(DataFrame,对标 Pandas,但快 10 倍、省内存一半)。
ndarray:Rust 的 NumPy
use ndarray::{Array2, Array3, arr2, Array};
// 创建矩阵
let mut a = Array2::<f32>::zeros((3, 3));
a[[0, 0]] = 1.0;
// 从向量构造
let b = arr2(&[
[1., 2., 3.],
[4., 5., 6.],
]);
// 矩阵乘法(@ 运算符)
let c = a.dot(&b.t().unwrap());
// 广播 + 逐元素运算
let d = &b * 2.0 + 1.0;
// 线性代数:SVD / 特征值 / 逆矩阵(需要 ndarray-linalg)
// use ndarray_linalg::Solve;
polars:Rust 的 Pandas
论为什么 polars 比 Pandas 快
Pandas 是单线程的,polars 用 Rust 写,底层用 Arrow 列式存储,默认多线程并行。同样一份 CSV,polars 读进来快 5-10 倍,内存占用一半。而且 polars 有 Lazy API——你先描述要做什么操作,polars 做查询优化(类似数据库优化器),最后一次性执行。
use polars::prelude::*;
// 读 CSV
let mut df = CsvReadOptions::default()
.try_into_reader_with_file_path(Some("data.csv".into()))?
.finish()?;
// 列选择 / 过滤 / 排序
let out = df
.select(["name", "age", "score"])?
.filter(&df.column("age")?.gt(18)?)?
.sort(["score"], false)?;
// 分组聚合:groupby + agg
let stats = df
.group_by(["city"])?
.agg([
col("age").mean(),
col("score").max(),
])?;
// Lazy API:查询优化器自动下推过滤
let lf = LazyCsvReader::new("big.csv").finish()?
.filter(col("age").gt(18))
.select([col("name"), col("score")]);
let df = lf.collect()?;
tokenizers:Hugging Face 的 Rust 分词器
Hugging Face 官方用 Rust 重写的分词器,Python 版就是它的 binding。BPE、WordPiece、Unigram 全支持,加载预训练 tokenizer 一行代码。大模型推理必备——模型只认 token id,不认字。
use tokenizers::Tokenizer;
let tok = Tokenizer::from_pretrained("Qwen/Qwen2-0.5B-Instruct", true)?;
let enc = tok.encode("你好,世界", true)?;
println!("token ids: {:?}", enc.get_ids());
let text = tok.decode(enc.get_ids(), true)?;
统计计算基础
AI 数据处理经常要算均值、方差、分位数、相关性。ndarray 自带 .mean()、.var(),高级统计用 statistical crate。
use ndarray::Array1;
let data = Array1::<f64>::linspace(0., 100., 1000);
let mean = data.mean().unwrap();
let std = data.std(0.);
let median = statistical::median(data.as_slice().unwrap());
let q75 = statistical::percentile(data.as_slice().unwrap(), 75.);
记
本章小结
① ndarray 对标 NumPy,polars 对标 Pandas(多线程 + Lazy API,更快更省)。
② tokenizers 加载 Hugging Face 预训练分词器,大模型推理必备。