我正在尝试实现使用Pyo3加载numpy array的方法。
use ndarray::{array, ArrayView, Ix2};
use numpy::PyArray2;
use pyo3::types::IntoPyDict;
use pyo3::{PyResult, Python};
pub fn load_2d_vec<'a>() -> ArrayView<'a, f32, Ix2> {
// let res: PyResult<ArrayView<'a, f32, Ix2>> = Python::with_gil::<FnOnce(Python<'a>), ArrayView<'a, f32, Ix2>>(|py| { // did no helped
let res: PyResult<ArrayView<'a, f32, Ix2>> = Python::with_gil(|py| {
let np = py.import("numpy")?;
let locals = [("np", np)].into_py_dict(py);
let pyarray: &PyArray2<f32> = py
.eval(r#"np.load("./test_file")"#, Some(locals), None)?
.extract()?;
let f = pyarray.readonly().as_array();
// let f: ArrayView<'a, f32, Ix2> = pyarray.readonly().as_array(); // with defined type and lifetime
Ok(f) // TODO - cannot return value referencing temporary value [E0515] returns a value referencing data owned by the current function
});
res.unwrap()
}
fn main() {
let a = load_2d_vec();
assert_eq!(a, array![[1.0, 2.0], [3.0, 4.0]]);
}
但是编译失败了“无法返回引用临时值的值”。我尝试用_gil方法传递一个生命周期给Python::但是我失败了。有什么想法吗?非常感谢。
1条答案
按热度按时间z9smfwbn1#
我发现了。
Python::with_gil
实体有自己的'py
生命周期。这意味着pyarray
只存在于with_gil
块中。所以我不能直接返回load_2d_vec
中的pyrarray。相反,我必须创建一个新变量,将pyarray
中的数据复制到该变量中。