массив pybind11 из 2d вектора без копии - PullRequest
0 голосов
/ 25 марта 2020

Как я могу создать массив 2d numpy из вектора векторов в pybind11?

Я ищу способ сделать это быстро и без копирования (так что двигаться?), И я ' Я хотел бы сделать это на основе шаблонов.

Пока у меня есть:

template< typename T >
py::array
array2d_from_vector(std::vector<std::vector<T>> & m) {
    if (m.empty()) return py::array_t<T>();
    std::vector<std::vector<T>>* ptr = new std::vector<std::vector<T>>(std::move(m));
    auto capsule = py::capsule(ptr, [](void* p) {
            delete reinterpret_cast<std::vector<std::vector<T>>*>(p);
    });
    return py::array_t<T>(
            {ptr->size(), ptr->at(0).size()},           // shape of array
            {ptr->at(0).size()*sizeof(T), sizeof(T)},   // c-style contiguous strides
            capsule);
}

, который возвращает бессмысленный 2d массив в python со значениями, такими как:

[[ 4.0852747e+30  3.0677226e-41  4.0853762e+30  3.0677226e-41]...

Так чего мне не хватает! Я предполагаю, что это связано с тем, как векторы хранят свои данные, но мои значения должны быть между 0 и 1.

...