我试图创建一个pybd11接口,它将两个编号数组的元组从C++返回到Python。lambda表达式中的子函数lttb返回两个类型为std::vector<double>
和std::vector<std::variant<uint32_t, in64_t, double>>
的向量
如果我直接返回向量,pybind11/stl.h
头可以很好地处理转换。创建double
numpy数组也可以完美地工作。但是,当尝试创建std::variant
的numpy数组时,我得到以下错误
..\subprojects\pybind11\include\pybind11/numpy.h(1159): error C2338: Attempt to use a non-POD or unimplemented POD type as a numpy dtype
有一种方法可以注册结构化类型(https://pybind11.readthedocs.io/en/stable/advanced/pycpp/numpy.html#structured-types)以防止出现此错误消息,但是我只看到一种方法可以使用struct
而不是使用std::variant
进行注册。有人知道如何创建std::variant
的numpy数组吗?应该没有那么难,因为std::vector<std::variant<...>>
的转换是开箱即用的。这是密码
.def("lttb",
[&](ScopeDataElement& data,
const std::pair<double, double>& limit,
int64_t masterTick,
long double samplingTime,
size_t destinationSize) {
auto&& [x, y] =
data.lttb(limit, masterTick, samplingTime, destinationSize);
using T = std::decay_t<decltype(x)>::value_type;
using U = std::decay_t<decltype(y)>::value_type;
auto arrx = py::array_t<T>(x.size(), x.data());
auto arry = py::array_t<U>(y.size(), y.data());
return py::make_tuple(arrx, arry);
})
目前没有回答
相关问题 更多 >
编程相关推荐