如何创建 boost::python::object 类型的 numpy 数组

How to create a numpy array of boost::python::object types

我正在尝试创建一个包含 python 个对象的 2x2 numpy 数组:

#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
int main()
{
    Py_Initialize();
    boost::python::numpy::initialize();
    boost::python::tuple shape = boost::python::make_tuple(2, 2);
    boost::python::object obj;
    boost::python::numpy::dtype dt = boost::python::numpy::dtype(obj);
    boost::python::numpy::ndarray array = boost::python::numpy::empty(shape, dt);
    std::cout << "Datatype is: " << boost::python::extract<char const *> boost::python::str(array.get_dtype())) << std::endl;
}

但输出是“Datatype is: float64”而不是 python 对象类型。

我做错了什么?

我怀疑我误用了 dtype 构造函数。

您正确使用了 dtype 构造函数;是 obj 造成了麻烦。

默认构造 boost::python::object obj;obj 设置为 'None' Python 对象。与 'None' 关联的 dtypeNPY_DEFAULT 数组描述符类型。并且在创建 numpy 数组时映射到 double,这解释了您的输出。 (从 Python 的角度来看这是有道理的 - 默认的 numpy 数组类型是双精度浮点类型。)

您可以使用

构造具有对象类型 (NPY_OBJECT) 的 dtype
boost::python::numpy::dtype dt = boost::python::numpy::dtype(boost::python::object("O"));

在您的情况下,这就是解决方法。我还冒昧地使用了一个匿名的临时文件,这就是 Boost 文档中的做法。 "O" 表示对象类型。