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

求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解析:用csv crate的ReaderBuilder指定制表符分隔符,逐行读取并解析数值,同时完成>0则为1.0,否则0.0的转换,一步到位。
  • 数组转置:ndarray的Array2提供t()方法,和Python中NumPy数组的.T完全对应,实现转置操作。
  • 轻量性:无需引入DataFrame相关的重型依赖,仅用两个专注于各自领域的轻量crate,代码简洁无冗余。

内容的提问来源于stack exchange,提问作者Roger V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:32:38