C++ 使用Pybind11向Python公开Eigen::Tensor
我试图使用pybind11向python公开一个特征张量。我可以毫无问题地编译所有内容,并且可以成功地将其导入python。但是,无法将数据转换为python类型。我尝试了两种方法。一种是直接公开数据,另一种是使用映射。两者在python环境中都失败C++ 使用Pybind11向Python公开Eigen::Tensor,c++,eigen,tensor,pybind11,C++,Eigen,Tensor,Pybind11,我试图使用pybind11向python公开一个特征张量。我可以毫无问题地编译所有内容,并且可以成功地将其导入python。但是,无法将数据转换为python类型。我尝试了两种方法。一种是直接公开数据,另一种是使用映射。两者在python环境中都失败 #include <pybind11/pybind11.h> #include <pybind11/stl.h> #include <pybind11/stl_bind.h> #include <pybin
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/stl_bind.h>
#include <pybind11/numpy.h>
#include <pybind11/eigen.h>
#include <unsupported/Eigen/CXX11/Tensor>
class myclass{
myclass(){
m_data = new float[m_dim1*m_dim2*m_dim3]; // Contiguous data that represents a three dimensional array
for(int i = 0; i<m_dim1*m_dim2*m_dim3; i++)
m_data[i] = i;
m_tensor = Eigen::TensorMap<Eigen::Tensor<float, 3>>(m_data, m_dim1, m_dim2, m_dim3);
}
Eigen::TensorMap<Eigen::Tensor<float, 3>>& getDataUsingMapping() { Eigen::TensorMap<Eigen::Tensor<float, 3>> temp(m_data, m_dim1, m_dim2, m_dim3); return temp; }
Eigen::Tensor<float, 3>& getDataWithoutUsingMapping() { return m_tensor};
private:
Eigen::Tensor<float, 3> m_tensor;
// In fact, m_data, m_dim1, m_dim2, m_dim3 all are
// read from a data file but for this example let's
// assume some values.
float* m_data;
int m_dim1 = 2, m_dim2 = 5, m_dim3 = 10;
}
PYBIND11_MODULE(example, m) {
py::class_<myclass>(m, "myclass")
.def(py::init<>())
.def("getDataUsingMapping", &myClass::getDataUsingMapping, py::return_value_policy::reference)
.def("getDataWithoutUsingMapping", &myClass::getDataWithoutUsingMapping, py::return_value_policy::reference);
}
我尝试包含所有pybdin11包含文件,但没有解决问题。有人能帮助我吗? < P> C++代码没有编译,Python代码不可能运行为发布,但是在修复了这些代码并进行逻辑更改之后,PybDun11不支持“未支持/特征/ CXX11/张量”的张力图。因为该类不提供与其他特征映射类相同的接口 我本以为映射器施法器的专业化会自动工作,但这样做是明确的:
template<>
struct py::detail::type_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>, void>
: py::detail::eigen_map_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>> {};
模板
结构py::细节::类型
:py::detail::eigen_map_caster{};
未能实例化pybind11::detail::EigenProps,b/c TensorMap未使用cols/rows/stride提供其维度。因此,SFINAE防止自动生成连铸机
除了使用名为“unsupported”的目录中的标题之外,没有其他选项了吗?如果没有,最好的办法是将TensorMap的内容复制到一个numpy数组中,并在自定义的
getDataUsingMapping
中返回该数组:有几个示例说明了如何在有复制和无复制的情况下执行此操作。(除非你愿意展平张量,否则EigenProps的专门化是不起作用的,但你可以用它作为一个例子为TensorMap编写一个新的泛型caster。)你的错误是在转换复数浮点时,我猜complex.h
没有包括在内,即使你尝试过。你能解释一下你是如何包括所有这些模块的吗(complex.h functional.h chrono.h
)?我的pybind11知识是因为你。感谢您在百忙之中抽出时间帮助社区。
template<>
struct py::detail::type_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>, void>
: py::detail::eigen_map_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>> {};