首页 文章

如何将Vec <ndarray :: Array1>的集合转换为Array2?

提问于
浏览
0

我正在尝试使用ndarray crate从 Vec 的1D阵列创建一个2D数组 . 在当前的实现中,我将 Vec<Array1<u32>> 作为一维数组的集合,而我很难弄清楚如何将其转换为 Array2<u32> . 我在 Vec<Array1<u32>> 上尝试了 from_vec() ,但它产生了 Array1<Array1<u32>> . 我想过使用 stack! 宏,但我不知道如何在上面的 Vec 上调用它 . 我正在使用ndarray 0.12.1和Rust 1.31.0 .

1 回答

  • 2

    我对 ndarray 并不是很熟悉,但看起来你必须将数据展平为中间步骤,然后从中重建 . 迭代器可能会更有效但我没有看到从迭代器构建的方法,也允许您指定形状 .

    它可能不是最有效的方法,但它至少起作用:

    fn to_array2<T: Copy>(source: &[Array1<T>]) -> Result<Array2<T>, impl std::error::Error> {
        let width = source.len();
        let flattened: Array1<T> = source.into_iter().flat_map(|row| row.to_vec()).collect();
        let height = flattened.len() / width;
        flattened.into_shape((width, height))
    }
    

    请注意,如果源阵列具有不同的长度,它可能会失败 . 此解决方案不是100%健壮,因为如果一个阵列较小但由另一个阵列更长的补偿,它将不会失败 . 可能值得在那里添加一张支票以防止这种情况,但我会留给你 .

相关问题