我正在尝试从 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/