如何让Rust中Polars转ndarray的函数通过编译?
Polars DataFrame转ndarray编译错误修复
我需要编写一个Rust函数,将Polars DataFrame(后续计划支持Series)转换为ndarray的Array,用于smartcore等库,但代码编译时出现类型不匹配错误(E0308),请帮忙修改代码使其通过编译。
原代码
:dep polars = {version="*"} :dep polars-core = {version="*",features=["ndarray"]} :dep ndarray = {version="*"} use polars::prelude::*; use ndarray::{Array,ArrayBase,Dimension,DataOwned,OwnedRepr}; fn convert_2_ndarray<D>( x_train:DataFrame, x_test:DataFrame, )->(ArrayBase<OwnedRepr<f64>,D>,ArrayBase<OwnedRepr<f64>,D>) where D: Dimension, { let x_train_conv = (&x_train).to_ndarray::<Float64Type>().unwrap(); let x_test_conv = (&x_test).to_ndarray::<Float64Type>().unwrap(); return (x_train_conv,x_test_conv) }
编译错误信息
[E0308] Error: mismatched types ╭─[command_413:1:1] │ 3 │ fn convert_2_ndarray<D>( · ┬ · ╰── this type parameter · 13 │ return (x_train_conv,x_test_conv) · ──────┬───── · ╰─────── expected type parameter `D`, found struct `Dim` ────╯ [E0308] Error: mismatched types ╭─[command_413:1:1] │ 3 │ fn convert_2_ndarray<D>( · ┬ · ╰── this type parameter · 13 │ return (x_train_conv,x_test_conv) · ─────┬───── · ╰─────── expected type parameter `D`, found struct `Dim`
错误原因
Polars的DataFrame::to_ndarray方法返回的是固定的二维ndarray(对应ArrayBase<OwnedRepr<f64>, Ix2>,别名Array2<f64>),而原函数使用了泛型维度D,编译器无法将具体的Ix2维度匹配到泛型参数D,因此抛出类型不匹配错误。
修改方案
- 移除泛型维度参数
D,直接使用具体的二维类型Array2<f64>作为返回值(Array2是底层类型的别名,写法更简洁)。 - 简化ndarray的导入,无需导入底层的
ArrayBase、OwnedRepr等类型,直接使用Array2即可。
修改后的代码:
:dep polars = {version="*"} :dep polars-core = {version="*",features=["ndarray"]} :dep ndarray = {version="*"} use polars::prelude::*; use ndarray::Array2; fn convert_2_ndarray( x_train: DataFrame, x_test: DataFrame, ) -> (Array2<f64>, Array2<f64>) { let x_train_conv = x_train.to_ndarray::<Float64Type>().unwrap(); let x_test_conv = x_test.to_ndarray::<Float64Type>().unwrap(); (x_train_conv, x_test_conv) }
后续扩展支持Series的说明
如果后续要支持Polars Series转ndarray,Series对应一维数组,返回类型应使用Array1<f64>,可以单独编写转换函数:
fn series_to_ndarray(series: Series) -> Array1<f64> { series.to_ndarray::<Float64Type>().unwrap() }
内容的提问来源于stack exchange,提问作者Ynax
相关产品推荐
相关产品推荐

