Как создать массив numpy типов объектов boost :: python :: - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь создать массив 2x2 numpy из python объектов:

#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;
}

Но на выходе получается «Тип данных: float64», а не тип объекта python.

Что я делаю не так?

Я подозреваю, что неправильно использую конструктор dtype.

1 Ответ

2 голосов
/ 07 августа 2020

Вы правильно используете конструктор dtype; это obj вызывает проблемы.

Конструкция по умолчанию boost::python::object obj; устанавливает obj как объект 'None' Python. dtype, связанный с 'None', является типом дескриптора массива NPY_DEFAULT. И это соответствует double при создании массива numpy, что объясняет ваш вывод. (Это имеет смысл с точки зрения Python - тип массива numpy по умолчанию является типом с плавающей запятой двойной точности.)

Вы можете создать dtype с типом объекта (NPY_OBJECT), используя

boost::python::numpy::dtype dt = boost::python::numpy::dtype(boost::python::object("O"));

что в вашем случае является исправлением. Я также взял на себя смелость использовать анонимный временный, как это сделано в документации Boost. "O" обозначает тип объекта.

...