1个不稳定版本
0.3.1 | 2022年8月24日 |
---|
#841 in 科学
23KB
281 行
nalgebra-numpy
此crate提供nalgebra和numpy之间的转换。当您想在Python和Rust代码之间共享nalgebra矩阵时,可以使用它,例如与inline-python
一起使用。
从numpy到nalgebra的转换。
可以创建numpy数组的视图或副本。您可以使用matrix_from_numpy
将数据复制到新的矩阵中,或者使用matrix_slice_from_numpy
或matrix_slice_mut_from_numpy
创建视图。如果numpy数组与请求的矩阵类型不兼容,则返回错误。
但请注意,借用检查器无法对由Python对象管理的数据执行规则。您可能可以在Rust中保留一个不可变的视图,然后从Python中修改数据。因此,创建任何视图——即使是不可变的视图——都是不安全的。
从nalgebra到numpy的转换。
nalgebra矩阵也可以转换为numpy数组,使用matrix_to_numpy
。此函数始终创建副本。由于所有nalgebra数组都可以表示为numpy数组,因此它直接返回一个pyo3::PyObject
而不是一个Result
。
示例。
将numpy数组复制到新的固定大小矩阵
use inline_python::{Context, python};
use nalgebra_numpy::{matrix_from_numpy};
let gil = pyo3::Python::acquire_gil();
let context = Context::new_with_gil(gil.python());
context.run(python! {
import numpy as np
matrix = np.array([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0],
])
});
let matrix = context.globals(gil.python()).get_item("matrix").unwrap();
let matrix : nalgebra::Matrix3<f64> = matrix_from_numpy(gil.python(), matrix)?;
assert_eq!(matrix, nalgebra::Matrix3::new(
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0,
));
也支持动态矩阵
use nalgebra::DMatrix;
#
let matrix : DMatrix<f64> = matrix_from_numpy(gil.python(), matrix)?;
assert_eq!(matrix, DMatrix::from_row_slice(3, 3, &[
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0,
]));
以及部分动态矩阵
use nalgebra::{MatrixMN, Dynamic, U3};
let matrix : MatrixMN<f64, U3, Dynamic> = matrix_from_numpy(gil.python(), matrix)?;
assert_eq!(matrix, MatrixMN::<f64, U3, Dynamic>::from_row_slice(&[
1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0,
]));
转换为Python对象如下所示
use nalgebra_numpy::matrix_to_numpy;
use nalgebra::Matrix3;
use inline_python::python;
let gil = pyo3::Python::acquire_gil();
let matrix = matrix_to_numpy(gil.python(), &Matrix3::<i32>::new(
0, 1, 2,
3, 4, 5,
6, 7, 8,
));
python! {
from numpy import array_equal
assert array_equal('matrix, [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
])
}
依赖项
~8–13MB
~177K SLoC