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

时间:2018-12-10 01:44:40

标签: multidimensional-array rust

我正在尝试使用ndarray板条箱从Vec的1D阵列中创建2D阵列。在当前的实现中,我将Vec<Array1<u32>>作为一维数组的集合,并且很难确定如何将其转换为Array2<u32>。我在from_vec()上尝试过Vec<Array1<u32>>,但产生了Array1<Array1<u32>>。我曾考虑过使用stack!宏,但不确定如何在上述Vec上调用它。我正在使用ndarray 0.12.1和Rust 1.31.0。

1 个答案:

答案 0 :(得分: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%健壮的,因为如果一个数组较小,但由另一个较长的数组补偿,它不会失败。可能值得在其中添加检查以防止这种情况,但我会留给您。