0

只是学习一些生锈。我正在使用ndarray,我需要构造一个从另一个矩阵复制维度的零矩阵。我试过了

fn make_0(matrix: Array2<i32>) -> Array2<i32> {
        Array2::zeros(matrix.shape())
}

但这不会编译:

error[E0271]: type mismatch resolving `<&[usize] as ShapeBuilder>::Dim == Dim<[usize; 2]>`
   --> src/lib.rs:62:9
    |
62  |         Array2::zeros(matrix.shape())
    |         ^^^^^^^^^^^^^ expected array `[usize; 2]`, found struct `IxDynImpl`
    |
    = note: expected struct `Dim<[usize; 2]>`
               found struct `Dim<IxDynImpl>`

我可以解决它

fn make_0(matrix: Array2<i32>) -> Array2<i32> {
        Array2::zeros((matrix.shape()[0], matrix.shape()[1]))
}

但我想有更好的东西,我在这里迷失了类型。

4

1 回答 1

2

推荐使用的文档ArrayBase::shape().raw_dim()

请注意,您可能不想使用它来创建与另一个数组具有相同形状的数组,因为使用例如Array::zeros()使用类型的形状创建数组&[usize]会导致动态维数组。如果要创建与另一个数组具有相同形状和维度的数组,请.raw_dim()改用:

// To get the same dimension type, use `.raw_dim()` instead:
let c = Array::zeros(a.raw_dim());
assert_eq!(a, c);

所以你可能想做这样的事情:

fn make_0(matrix: Array2<i32>) -> Array2<i32> {
    Array2::zeros(matrix.raw_dim())
}
于 2022-02-28T20:39:52.297 回答