7 个版本

0.3.0 2021年2月4日
0.2.1 2020年1月14日
0.2.0 2019年11月14日
0.1.3 2019年11月13日

#401科学

BSD-2-Clause

24KB
291

nalgebra-numpy

此crate提供nalgebra和numpy之间的转换。当您想在Python和Rust代码之间共享nalgebra矩阵时,可以使用它,例如与inline-python一起使用。

从numpy到nalgebra的转换。

您可以创建numpy数组的视图或副本。您可以使用matrix_from_numpy将数据复制到一个新矩阵,或者使用matrix_slice_from_numpymatrix_slice_mut_from_numpy创建一个视图。如果numpy数组与请求的矩阵类型不兼容,将返回错误。

但是请注意,借用检查器无法强制执行由Python对象管理的数据的规则。您可能可以在Rust中保持一个不可变的视图,然后从Python修改数据。因此,创建任何视图(即使是不可变的)都是不安全的。

从nalgebra到numpy的转换。

您还可以使用matrix_to_numpy将nalgebra矩阵转换为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],
    ])
}

依赖关系

~7MB
~138K SLoC