pybind11 vector <char>и vector <string>to numpy array <str> - PullRequest
0 голосов
/ 23 марта 2020

Я ищу самый быстрый способ получить std::vector<char> и std::vector<std::string> из c ++ в py: массив (numpy массив) с типом данных "<S1" или просто хорошей олеодной строкой. (уничтожение источника в порядке!)

моя текущая лучшая попытка для символов

template<>
py::array
array_from_vector(std::vector<char> & m) {
    std::vector<char>* ptr = new std::vector<char>(std::move(m));
    auto capsule = py::capsule(ptr, [](void* p) {
            delete reinterpret_cast<std::vector<char>*>(p);
    });
    return py::array(
            py::dtype("<S1"),
            {ptr->size()},
            {},
            ptr->data(),
            capsule
    );
}

однако на самом деле это все еще довольно медленно и возвращает [b'A' b'B' ...], что мне не нужно

Для справки, что такое «медленный»: в задаче, которая занимает 6 секунд, операция char применяется дважды и занимает 1 секунду из этих 6.

для строк, которые я использую следующее: (это занимает около 0,5 секунд на одну операцию.)

template<>
py::array
array_from_vector(std::vector<std::string> & m) {
    return py::array(py::cast(std::move(m)));
}

Мне не повезло на стороне numpy, поскольку эти операции занимают значительно больше времени ...

...