求Python读取TSV并转换为数组代码的Rust等价实现
Python转Rust:TSV解析为浮点数组的简洁实现
需求背景
原Python代码实现了以下逻辑:读取本地TSV文件,将所有大于0的元素转换为float64类型,转置后得到NumPy数组。由于后续无需DataFrame操作,希望避开Polars,用更轻量简洁的方式实现。
原Python代码:
import numpy as np import pandas as pd X = pd.read_csv('./myfile.tsv', sep='\t') X1 = (X > 0).astype(np.float64).T X2 = X1.to_numpy()
简洁实现方案
我们可以用csv crate处理TSV解析,ndarray crate处理数组操作,两者组合既轻量又能满足需求。
1. 添加依赖
在Cargo.toml中添加:
[dependencies] csv = "1.2" ndarray = "0.15"
2. Rust实现代码
use csv::ReaderBuilder; use ndarray::{Array2, Axis}; use std::error::Error; fn main() -> Result<(), Box<dyn Error>> { // 初始化TSV读取器,设置分隔符为制表符 let mut reader = ReaderBuilder::new() .delimiter(b'\t') .from_path("./myfile.tsv")?; // 解析所有行,将每个元素转为f64,同时处理>0的逻辑 let data: Vec<Vec<f64>> = reader .records() .map(|record| { record? .iter() .map(|s| { let val: f64 = s.parse()?; Ok(if val > 0.0 { 1.0 } else { 0.0 }) }) .collect::<Result<_, Box<dyn Error>>>() }) .collect::<Result<_, Box<dyn Error>>>()?; // 将Vec转为ndarray的二维数组,然后转置 let array = Array2::from_shape_vec( (data.len(), data[0].len()), data.into_iter().flatten().collect(), )?; let transposed_array = array.t(); // 这里可以使用转置后的数组进行后续操作 println!("转置后的数组:\n{:?}", transposed_array); Ok(()) }
代码说明
- TSV解析:用
csvcrate的ReaderBuilder指定制表符分隔符,逐行读取并解析数值,同时完成>0则为1.0,否则0.0的转换,一步到位。 - 数组转置:
ndarray的Array2提供t()方法,和Python中NumPy数组的.T完全对应,实现转置操作。 - 轻量性:无需引入DataFrame相关的重型依赖,仅用两个专注于各自领域的轻量crate,代码简洁无冗余。
内容的提问来源于stack exchange,提问作者Roger V.
相关产品推荐
相关产品推荐

