Как конвертировать коллекцию Vecв Array2? - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать двумерный массив из Vec одномерных массивов, используя ящик с ndarray.В текущей реализации у меня есть 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 голосов
/ 10 декабря 2018

Я не очень знаком с 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% надежно, потому что оно не будет работать, если один массив меньше, но компенсируется другим массивом длиннее.Вероятно, стоит добавить чек, чтобы предотвратить это, но я оставлю это вам.

...