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

Download history 42032/week @ 2024-04-22 38552/week @ 2024-04-29 45089/week @ 2024-05-06 43241/week @ 2024-05-13 37955/week @ 2024-05-20 40189/week @ 2024-05-27 52552/week @ 2024-06-03 40921/week @ 2024-06-10 48554/week @ 2024-06-17 42032/week @ 2024-06-24 40280/week @ 2024-07-01 40555/week @ 2024-07-08 37280/week @ 2024-07-15 42077/week @ 2024-07-22 44909/week @ 2024-07-29 47896/week @ 2024-08-05

173,639 每月下载量
110 个 Crates 中使用 (96 个直接使用)

BSD-2-Clause

325KB
5.5K SLoC

rust-numpy

Actions Status Crate Minimum rustc 1.48 Documentation codecov

NumPy C-API 的 Rust 绑定。

API 文档

要求

  • Rust >= 1.48.0
    • 基本上,我们的 MSRV 跟随 PyO3
  • Python >= 3.7
    • 从 0.16 版本开始删除了 Python 3.6 支持
  • 一些 Rust 库
  • 在您的 Python 环境中安装 numpy(例如,通过 pip install numpy
    • 我们推荐使用 numpy >= 1.16.0,尽管较旧版本可能也能工作

示例

使用 Rust 编写 Python 模块

请参阅 simple 示例了解如何开始。

还有使用 ndarray-linalgrayon 的示例。

[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.10.15.3ndarray,尽管 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