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