Binding array of arrays
I'm attempting to bind a xt::pyarray<xt::pyarray<double>> to a Numpy array of arrays, but I am getting compilation errors instantiating the pyarray. The error is a bit long to include here, the relevant bit is
pybind11/include/pybind11/numpy.h:260:81: error: no member named 'dtype' in 'pybind11::detail::npy_format_descriptor<xt::pyarray<double, 16>, void>' return detail::npy_format_descriptor<typename std::remove_cv<T>::type>::dtype();
coming from the call to pybind11::dtype::of<T> in the return ofpyarray::raw_array_t. Unfortunately, I don't know enough about the inner workings of pybind11 to determine if the problem lies there, or whether this is a xtensor-python issue.
The problem I am trying to solve is to provide Python bindings to a code that uses xtensor xarray. Using xt::xarray<xt::xarray<double>> in a C++-only situation works as expected. Actually, my case is limited in that I always have three inner arrays, so in C++ I would prefer to use std::array<xt::xarray<double>, 3> (or perhaps xt::xtensor<xt::xarray<double>, 3>) but I do not know how to transparently (without copies) expose those as an ndarray of three ndarrays to Python.
Example code that produces the compilation error:
#include <numeric>
#include "pybind11/pybind11.h"
#include "xtensor/xarray.hpp"
#include "xtensor/xmath.hpp"
#include "xtensor-python/pyarray.hpp"
double sum_of_dim(xt::pyarray<xt::pyarray<double>> & m, const int dim)
{
auto d = m(dim);
return std::accumulate(d.begin(), d.end(), 0.0);
}
PYBIND11_PLUGIN(example1_m)
{
pybind11::module m("example1_m", "Array of array test");
m.def("sum_of_dim", sum_of_dim, "Array of array function test");
return m.ptr();
}
Sorry for the late response; at first sight, it seems the problem is on xtensor-python side.
I think with the recently merged support for pybind11 dtypes we're closer to solving this one. However, I think we do not yet have specializations for dtype<pyarray<T>> which seem necessary.
Needs some experiments to see if we can get this to work!