36 个版本 (20 个破坏性更新)
0.21.0 | 2024 年 3 月 31 日 |
---|---|
0.20.0 | 2023 年 10 月 12 日 |
0.19.0 | 2023 年 5 月 31 日 |
0.18.0 | 2023 年 1 月 18 日 |
0.2.1 | 2017 年 5 月 16 日 |
#7 in FFI
173,639 每月下载量
在 110 个 Crates 中使用 (96 个直接使用)
325KB
5.5K SLoC
rust-numpy
NumPy C-API 的 Rust 绑定。
API 文档
要求
- Rust >= 1.48.0
- 基本上,我们的 MSRV 跟随 PyO3
- Python >= 3.7
- 从 0.16 版本开始删除了 Python 3.6 支持
- 一些 Rust 库
- ndarray 用于 Rust 侧矩阵库
- PyO3 用于 Python 绑定
- 等等(见 Cargo.toml)
- 在您的 Python 环境中安装 numpy(例如,通过
pip install numpy
)- 我们推荐使用
numpy >= 1.16.0
,尽管较旧版本可能也能工作
- 我们推荐使用
示例
使用 Rust 编写 Python 模块
请参阅 simple 示例了解如何开始。
还有使用 ndarray-linalg 和 rayon 的示例。
[lib]
name = "rust_ext"
crate-type = ["cdylib"]
[dependencies]
pyo3 = { version = "0.21", features = ["extension-module"] }
numpy = "0.21"
use numpy::ndarray::{ArrayD, ArrayViewD, ArrayViewMutD};
use numpy::{IntoPyArray, PyArrayDyn, PyReadonlyArrayDyn, PyArrayMethods};
use pyo3::{pymodule, types::PyModule, PyResult, Python, Bound};
#[pymodule]
fn rust_ext<'py>(_py: Python<'py>, m: &Bound<'py, PyModule>) -> PyResult<()> {
// example using immutable borrows producing a new array
fn axpy(a: f64, x: ArrayViewD<'_, f64>, y: ArrayViewD<'_, f64>) -> ArrayD<f64> {
a * &x + &y
}
// example using a mutable borrow to modify an array in-place
fn mult(a: f64, mut x: ArrayViewMutD<'_, f64>) {
x *= a;
}
// wrapper of `axpy`
#[pyfn(m)]
#[pyo3(name = "axpy")]
fn axpy_py<'py>(
py: Python<'py>,
a: f64,
x: PyReadonlyArrayDyn<'py, f64>,
y: PyReadonlyArrayDyn<'py, f64>,
) -> Bound<'py, PyArrayDyn<f64>> {
let x = x.as_array();
let y = y.as_array();
let z = axpy(a, x, y);
z.into_pyarray_bound(py)
}
// wrapper of `mult`
#[pyfn(m)]
#[pyo3(name = "mult")]
fn mult_py<'py>(a: f64, x: &Bound<'py, PyArrayDyn<f64>>) {
let x = unsafe { x.as_array_mut() };
mult(a, x);
}
Ok(())
}
从 Rust 执行 Python 程序并获取结果
[package]
name = "numpy-test"
[dependencies]
pyo3 = { version = "0.21", features = ["auto-initialize"] }
numpy = "0.21"
use numpy::{PyArray1, PyArrayMethods};
use pyo3::{types::{IntoPyDict, PyAnyMethods}, PyResult, Python};
fn main() -> PyResult<()> {
Python::with_gil(|py| {
let np = py.import_bound("numpy")?;
let locals = [("np", np)].into_py_dict_bound(py);
let pyarray = py
.eval_bound("np.absolute(np.array([-1, -2, -3], dtype='int32'))", Some(&locals), None)?
.downcast_into::<PyArray1<i32>>()?;
let readonly = pyarray.readonly();
let slice = readonly.as_slice()?;
assert_eq!(slice, &[1, 2, 3]);
Ok(())
})
}
依赖于 ndarray
该软件包在其公共API中使用来自 ndarray
的类型。 ndarray
在软件包根目录中重新导出,因此您无需将其指定为直接依赖项。
此外,此软件包与多个版本的 ndarray
兼容,因此依赖于一系列 semver 不兼容的版本,目前为 >= 0.13, < 0.16
。如果直接或间接依赖于除该确切范围之外的任何内容,Cargo 不会自动选择 ndarray
的单个版本。因此,可能需要手动统一这些依赖项。
例如,如果您指定以下依赖项
numpy = "0.21"
ndarray = "0.13"
默认情况下,这将依赖于版本 0.13.1
和 0.15.3
的 ndarray
,尽管 0.13.1
在范围 >= 0.13, < 0.16
内。要修复此问题,您可以运行
cargo update --package ndarray:0.15.3 --precise 0.13.1
以实现对 ndarray
版本 0.13.1
的单个依赖。
贡献
PyO3 的 Contributing.md 是一个不错的入门指南。
此外,我们有一个 Gitter 频道用于沟通。
依赖项
~5–12MB
~138K SLoC