1

1 次元 NDArray (rust-numpy) と usize をパラメーターとして取り、PyO3 を使用して 1 次元配列を返し、Python からコードを呼び出す関数をラップしたいと考えています。残念ながら、PyO3 で配列を処理する方法の良い例を見つけることができません。これは私がこれまでに持っているコードです:

use numpy::ndarray::prelude::*;
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

#[pyfunction]
fn sma(prices: &Array1<f32>, period: usize) -> PyResult<Array1<f32>> {
    let length = prices.len() - period +1;
    let mut result = Array1::<f32>::zeros(length);

    for i in 0..length {
        let slice = prices.slice(s![i..i+period]);
        result[i] = slice.sum()/(period as f32);
    }

    Ok(result)
}

#[pymodule]
fn panther(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sma, m)?)?;
    Ok(())
}

デコレータとモジュールラッピング機能を追加しました。今、私はこのエラーが発生しています:

error[E0277]: the trait bound `Result<ArrayBase<OwnedRepr<f32>, Dim<[usize; 1]>>, PyErr>: IntoPyCallbackOutput<_>` is not satisfied.

これは私の cargo.toml です:

[package]
name = "panther"
version = "0.1.0"
edition = "2021"

[lib]
name = "panther"
crate-type = ["cdylib"]

[dependencies]
pyo3 = { version = "0.12.3", features = ["extension-module"] }
numpy = "0.15"

PyO3 で使用するために SMA 関数を実際に変更する方法を教えてもらえますか? ありがとうございました!

4

1 に答える 1