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

标签 multidimensional-array rust

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

最佳答案

我对 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% 稳健,因为如果一个阵列较小但由另一个较长的阵列补偿,它不会失败。可能值得在其中添加一个检查以防止出现这种情况,但我会把它留给你。

关于multidimensional-array - 如何将 Vec<ndarray::Array1> 的集合转换为 Array2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53698503/

相关文章:

php - 将两套MySQL多维数组的PHP mysql_fetch_assoc集合并为一个一维数组

generics - 使用泛型进行算术运算时不能应用二元运算

rust - 将不可复制的拥有值传递给函数后尝试使用它们时会出现生命周期问题

rust - 如何将 `Option<&mut ...>` 传递给多个函数调用而不会导致移动错误?

types - 我如何在 Rust 中打印变量的类型?

c - 将数组的内存分配给 char 指针

arrays - 如何从多维数组计算一维索引?例如二维到一维 : y * xTot + x = i. 但更大

javascript - 将 2D 数组的 2D 网格展平为单个 2D 数组,在 JavaScript 中(功能上?)

rust - 你可以在没有语法变量的 Rust 宏中使用可选参数吗?

C++全局数组分配