我想将Python中的2D Numpy数组转换为Rust向量. 具体地说,数组的第二维度是已知的. 也就是说,数组的形状为[VARIABLE,1024](类型为double) 我想知道如何将其转换为Rust矢量. 具体而言,Vec [f64;1024]<>

我知道我应该用Rust—Numpy来做这个 第一步应该是把它转换成PyReadonlyArray2 但我不知道下一步该怎么办?

推荐答案

ndarray不支持常量维数,所以你不会找到转换为数组的支持(nalgebra确实支持它们,但看起来它不支持转换为Vec).因此,第一步将是转换为Vec<f64>,然后转换为Vec<[f64; 1024]>(这可以在没有不安全代码的情况下使用像bytemuck这样的 crate ).

如果我们想有效地做,第一步也可以相当复杂.如果我们可以直接分配和使用memcpy()复制内容,那将是很好的;然而,我们只能这样做,如果数组是连续的(即不是一个不连续的视图),and它是在C布局,即行为主的布局,而不是Fortran布局(列为主).

总而言之:

const ARRAY_SIZE: usize = 1024;

fn numpy_to_vec(arr: &PyReadonlyArray2<f64>) -> PyResult<Vec<[f64; ARRAY_SIZE]>> {
    if arr.shape()[1] != ARRAY_SIZE {
        return Err(PyTypeError::new_err(format!(
            "expected column size to be {ARRAY_SIZE}",
        )));
    }

    let data = if arr.is_c_contiguous() {
        arr.as_slice().unwrap().to_vec()
    } else {
        let mut data = Vec::with_capacity(arr.len());
        let arr = arr.as_array();
        for row in arr.axis_iter(Axis(0)) {
            match row.as_slice() {
                Some(row) => data.extend_from_slice(row),
                None => data.extend(row),
            }
        }
        data
    };

    Ok(bytemuck::allocation::cast_vec(data))
}

Rust相关问答推荐

无需通过ASIO输入音频,并使用cpal进行反馈示例

borrow 和内部IntoIterator

如何访问Rust存储值的内存地址

在本例中,为什么我不能一次多次borrow 可变变量?

`RwLockWriteGuard_,T`不实现T实现的特征

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

为什么我需要 to_string 函数的参考?

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

Rust,如何从 Rc> 复制内部值并返回它?

如何限制 GtkColumnView 行数

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

如何获取模块树?

如何从trait方法返回std :: iter :: Map?

如何创建递归borrow 其父/创建者的 struct ?

Rust 异步和 AsRef 未被发送

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

是否有适当的方法在参考 1D 中转换 2D 数组

为什么分配对变量的引用使我无法返回它

在 Rust 中获得准确时间的正确方法?

`if let` 只是另一种编写其他 `if` 语句的方式吗?