Crate nalgebra_numpy[−][src]
This crate provides conversion between nalgebra
and numpy
.
It is intended to be used when you want to share nalgebra matrices between Python and Rust code,
for example with inline-python
.
Conversion from numpy to nalgebra.
It is possible to create either a view or a copy of a numpy array.
You can use matrix_from_numpy
to copy the data into a new matrix,
or one of matrix_slice_from_numpy
or matrix_slice_mut_from_numpy
to create a view.
If a numpy array is not compatible with the requested matrix type,
an error is returned.
Keep in mind though that the borrow checker can not enforce rules on data managed by a Python object. You could potentially keep an immutable view around in Rust, and then modify the data from Python. For this reason, creating any view -- even an immutable one -- is unsafe.
Conversion from nalgebra to numpy.
A nalgebra matrix can also be converted to a numpy array, using matrix_to_numpy
.
This function always creates a copy.
Since all nalgebra arrays can be represented as a numpy array,
this directly returns a pyo3::PyObject
rather than a Result
.
Examples.
Copy a numpy array to a new fixed size matrix:
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, ));
Dynamic matrices are also supported:
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, ]));
And so are partially dynamic matrices:
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, ]));
A conversion to python object looks as follows:
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], ]) }
Structs
IncompatibleArrayError | Error indicating that the input array is not compatible with the requested nalgebra matrix. |
Shape | Compile-time shape of a matrix used in errors. |
UnalignedArrayError | Error indicating that the input array is not properly aligned. |
WrongObjectTypeError | Error indicating that the Python object is not a |
Enums
Dimension | Compile-time matrix dimension used in errors. |
Error | Error that can occur when converting from Python to a nalgebra matrix. |
Functions
matrix_from_numpy | Create an owning nalgebra matrix from a numpy array. |
matrix_slice_from_numpy⚠ | Create a nalgebra view from a numpy array. |
matrix_slice_from_numpy_ptr⚠ | Same as |
matrix_slice_mut_from_numpy⚠ | Create a mutable nalgebra view from a numpy array. |
matrix_slice_mut_from_numpy_ptr⚠ | Same as |
matrix_to_numpy | Copy a nalgebra matrix to a numpy ndarray. |