我想将Python中的2D Numpy数组转换为Rust向量. 具体地说,数组的第二维度是已知的. 也就是说,数组的形状为[VARIABLE,1024](类型为double) 我想知道如何将其转换为Rust矢量. 具体而言,Vec [f64;1024]<>
我知道我应该用Rust—Numpy来做这个 第一步应该是把它转换成PyReadonlyArray2 但我不知道下一步该怎么办?
我想将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))
}
未被发送