如何创建 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'
关联的 dtype
是 NPY_DEFAULT
数组描述符类型。并且在创建 numpy
数组时映射到 double
,这解释了您的输出。 (从 Python 的角度来看这是有道理的 - 默认的 numpy
数组类型是双精度浮点类型。)
您可以使用
构造具有对象类型 (NPY_OBJECT
) 的 dtype
boost::python::numpy::dtype dt = boost::python::numpy::dtype(boost::python::object("O"));
在您的情况下,这就是解决方法。我还冒昧地使用了一个匿名的临时文件,这就是 Boost 文档中的做法。 "O"
表示对象类型。
我正在尝试创建一个包含 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'
关联的 dtype
是 NPY_DEFAULT
数组描述符类型。并且在创建 numpy
数组时映射到 double
,这解释了您的输出。 (从 Python 的角度来看这是有道理的 - 默认的 numpy
数组类型是双精度浮点类型。)
您可以使用
构造具有对象类型 (NPY_OBJECT
) 的 dtype
boost::python::numpy::dtype dt = boost::python::numpy::dtype(boost::python::object("O"));
在您的情况下,这就是解决方法。我还冒昧地使用了一个匿名的临时文件,这就是 Boost 文档中的做法。 "O"
表示对象类型。