1

我正在尝试计算 Rust 中数据框的协方差。ndarray_statscrate 为数组定义了这样一个函数,我可以从DataFrameusing生成一个数组to_ndarray。如果我使用文档中的a示例(Array2DataFrame

use polars::prelude::*;
use ndarray_stats::CorrelationExt;

fn cov(df: &DataFrame) -> Vec<f64> {
    // Both of these are Array2<f64>s
    let mat = df.to_ndarray::<Float64Type>().unwrap();
    let a = arr2(&[[1., 3., 5.], [2., 4., 6.]]);

    let x = a.cov(1.).unwrap();
    let y = mat.cov(1.).unwrap();
}
   |
22 |     let y = mat.cov(1.).unwrap();
   |                 ^^^ method not found in `ndarray::ArrayBase<ndarray::data_repr::OwnedRepr<f64>, ndarray::dimension::dim::Dim<[usize; 2]>>`

为什么编译器允许定义xbut not y?如何修复y可以分配的代码?

4

1 回答 1

2

这是依赖版本不匹配。polars-core 取决于ndarray0.13.x 的版本 0.14.7,而 ndarray-stats0.5 需要ndarray0.15。当您在项目中使用最新版本的ndarray时,2D 数组类型x将与 提供的扩展特征兼容CovExtndarray-statsy不兼容。

无论库中类型的性质如何,一旦包含多个与 semver 不兼容的库版本,它们的类型通常将不可互换。换句话说,即使它们Array2<_>看起来是相同的类型,编译器也会将它们视为不同的类型。

可以通过检查 的输出找到包中 crate 的多个版本,该输出cargo tree -d仅显示重复的依赖项和显示依赖于它们的 crate 的反向树。重复不一定会造成问题,但如果项目直接使用多个 API,就会出现问题。

写这篇文章时的最低公分母是降级ndarray到 0.13 和ndarray-stats0.3,这也有方法cov。为了在那里更新,可能还值得考虑为polars项目做出贡献ndarray

于 2021-07-19T16:43:20.703 回答