gpt4 book ai didi

python - 使用 boost python 从 C++ 传递一个 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:15 24 4
gpt4 key购买 nike

我需要将一个 numpy 数组从 C++ 传递给 python 函数。代码如下。 python 方面:

import numpy as np
import convert as cv

def f(x):
x[0] = 5.
return len(x)

if __name__ == '__main__':
y = np.array([1., 2., 3., 4.])
x = cv.func_n(f, y)
print x

C++ 方面:

#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;
double func_n(PyObject* f, numeric::array &x)
{
std::cerr << "Inside func_n\n";
return boost::python::call<double>(f, boost::ref(x));
}

BOOST_PYTHON_MODULE(convert)
{
numeric::array::set_module_and_type("numpy", "ndarray");

def("func_n", &func_n);

}

C++ 代码应该做的是将 python functopn 和 numpy 数组作为两个参数,然后将 numpy 数组传递给 python 函数。我得到的错误是:

Traceback (most recent call last):
File "mm.py", line 11, in <module>
x = cv.func_n(f, y)
TypeError: No Python class registered for C++ class class boost::python::numeric::array

为什么?我是否必须在解释器的递归调用期间注册模块,如果是,如何注册?

最佳答案

boost::ref(x)返回 boost::reference_wrapper<T> ,它允许您将引用传递给按值函数。

boost::python::call docs显示参数根据其类型被区别对待。如果 arg 是 boost::reference_wrapper<T> , 它有效地传递了对 x 的引用下至 Python。

因此,在上面的代码中,您将对 numeric::array 的引用传递给了 Python。您从 Python 调用的函数也接受引用。

现在我不确定这一点,但我怀疑由于您实际上从未在 Python/C++ 之间传递 numeric::array,因此 boost::python 决定不包装它或创建转换器(因为您确实只是传递地址)。这可能就是为什么您没有看到为 numeric::array 类型注册的 Python 类。

关于python - 使用 boost python 从 C++ 传递一个 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13015411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com