使用 Pybind11 将 Eigen::Tensor 暴露给 Python

2023-12-06

我正在尝试使用 pybind11 将特征张量暴露给 python。我可以毫无问题地编译所有内容,并可以成功地将其导入到 python 中。但是,数据无法转换为python类型。我尝试了两种方法。一是直接公开数据,二是使用映射。两者都在 python 环境中失败。

#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);
}

我希望能够在 python 中处理这个 3D 数组及其维度信息(m_dim1, m_dim2, m_dim3).

以下是我尝试在 python 中获取数据后收到的错误消息。

>>> import example
>>> d = example()
>>>
>>> DataInPython = d.getDataUsingMapping()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unable to convert function return value to a Python type! The signature was
        (self: example) -> Eigen::TensorMap<Eigen::Tensor<float,3,0,__int64>,0,Eigen::MakePointer>
>>>
>>>
>>> DataInPython = d.getDataWithoutUsingMapping()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unable to convert function return value to a Python type! The signature was
        (self: example) -> Eigen::Tensor<std::complex<float>,3,0,__int64>

Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,
<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic
conversions are optional and require extra headers to be included
when compiling your pybind11 module.

我尝试包含所有 pybdin11 包含文件,但没有解决问题。有人可以帮助我吗?


C++ 代码无法编译,Python 代码不可能按照发布的方式运行,但是在修复这些代码并进行逻辑更改之后,结论仍然是 pybind11 不支持来自“unsupported/Eigen/CXX11/Tensor”的 TensorMap,因为类不提供与其他特征映射类相同的接口。

我本来期望映射器caster的专门化能够自动工作,但是明确地这样做:

template<>
struct py::detail::type_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>, void>
    : py::detail::eigen_map_caster<Eigen::TensorMap<Eigen::Tensor<float, 3>>> {};

pybind11::detail::EigenProps 的实例化失败,b/c TensorMap 不提供其维度 cols/rows/stride。因此,SFINAE 可以防止自动生成脚轮。

除了使用名为“unsupported”的目录中的标头之外,是否没有其他选择?如果没有,最好的选择是将 TensorMap 的内容复制到 numpy 数组,并以自定义形式返回该数组getDataUsingMapping:有几个例子说明如何在 SO 上执行此操作,无论有没有复制。 (除非您愿意展平张量,否则 EigenProps 的特化将不起作用,但您可以使用它作为示例为 TensorMap 编写新的通用类型转换程序。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Pybind11 将 Eigen::Tensor 暴露给 Python 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • Python Curses - 打印 Ascii 艺术

    我有一个很长的多行 ascii art 字符串 我想使用 Pythoncurses 模块将其呈现给用户 我对此有点困惑 因为在curses中打印字符串的唯一方法是addstr y x string 它只打印到一行 关于如何实现这一点有什么想
  • 如何在JPA中实现复杂的多对多关系?

    这里是数据库架构 CREATE TABLE Products id INT NOT NULL AUTO INCREMENT category id INT NOT NULL description VARCHAR 100 price DEC
  • 如何从多个匹配对象中删除数组中的单个对象

    var testarray NSArray testarray 1 2 2 3 4 5 3 print testarray testarray removeObject 2 我想从多个匹配对象中删除单个对象 例如 myArray 1 2 2
  • 实时编辑用户输入

    是否可以自动插入字符EditText 当用户输入数据时 IE 如果用户输入一个长数字 例如123456789012 这个数字是否有可能在他在编辑文本框中键入时出现 但每 4 个字符有一个破折号 因此 当您输入上面的数字时 您会看到它被输入到
  • 圆形图像按钮android

    我有一个如图所示的图像按钮 我想要它周围的红色空间 它将是透明的 只是用红色来标识空间 将不可点击 是否可以 我尝试了不同的代码 例如通过 xml 或一些圆形图像视图代码 但没有任何帮助 无需计算任何内容 您唯一需要做的就是在按钮模板 xm
  • 在浏览器中强制使用 Mime 类型(使用 Javascript)

    我认为出于安全考虑这是不可能的 但是 是否可以强制浏览器处理具有某种 mime 类型的文件不控制服务器 我正在从 file 在客户端的机器本身上 提供文件 并且我希望文本文件可以在其关联的文本编辑器中打开 注意 Firefox 只是打开文件
  • 在递归函数调用之前使用 return 子句与不使用 return 子句有何不同?

    我只是在尝试一些递归 并注意到一些让我困惑的事情 让我用一些代码示例来说明 function loop x if x gt 10 return x loop x 1 the recursive call loop 0 上面的调用返回unde
  • 设计内存有限的记忆系统的简单方法是什么?

    我正在编写一个手动计算记忆系统 呃 在 Matlab 中 简单的部分很简单 执行计算后将数据放入记忆系统的一种方法 一种从记忆中查询和获取数据的方法 一种查询系统所有 密钥 的方法 这些部分没有太多疑问 问题是我的计算机的内存量有限 因此有
  • Firebase UI 回收器适配器中的不同子集合

    我正在尝试获取不同的子集合并使它们适应我的RecyclerAdapter与 Firebase UI 我的Cloud Firestore设置如下 user Collection uid1 Document name email fields
  • 将 XML 文档导入 Rails 数据库?

    我一直在阅读一个又一个的教程 但似乎没有什么对我有用 目标是获取包含元素和属性的 XML 文档并将数据插入数据库中 每个元素 属性将是数据库中的一列 每个条目是一行 这是我一直在使用的虚构 XML 文档
  • 使用 html 链接打开 Android 日历

    我需要在 Android 设备上打开日历应用程序 使用简单的 html 链接 我可以在 iOS 中使用 href CALSHOW 执行此操作 安卓有类似的东西吗 或者有什么解决方法吗 提前致谢 在 Android 上 有一种比 ios ur
  • numpy.random.shuffle 返回 None

    我安装了numpy1 8 2然后我尝试了以下代码 import numpy as np a np arange 10 print a np random shuffle a 但它的输出是 0 1 2 3 4 5 6 7 8 9 None 我
  • heroku:Spring Boot 仅使用 https 访问端点

    我在heroku 上部署了一个Spring Boot java 应用程序 我想确保我的注册端点只能通过 https 访问 到目前为止我知道 heroku 使用负载均衡器 它将每个 https 连接重定向到带有特殊标头 X forwarded
  • Apache Spark-reducebyKey-Java-

    我正在尝试了解reduceByKeySpark中使用java作为编程语言 假设我有一句话 我就是我 我将句子分解成单词并将其存储为列表 I am who I am 现在这个函数分配1对每个单词 JavaPairRDD
  • java正则表达式插入字符作为特定索引位置

    我需要简单地在字符串的第三个位置插入字符 ie EURUSD 变成 EUR USD 我正在使用一些程序 GUI 来执行此操作 它接受正则表达式模式和替换 我知道这一定非常简单 但我似乎找不到简单的答案 Replace 3 3 3 人物 位于
  • 从正在运行的程序中获取变量

    我有一个运行数天的脚本 里面有一个计数器 计数器定期写入文件 是否可以从另一个 python 脚本 linux 命令甚至 java 找出计数器设置的值 简单的Python计数器示例 import time import random a 0
  • FragmentOnAttachListener 在片段附加到其主机后不会每次都调用

    最近google对android的改动中 Fragment 1 3 0版本还添加了新的FragmentOnAttachListener接口来替代不太灵活的onAttachFragment方法 如在document提及 此方法已被弃用 的责任
  • Pandas - 扩大平均会话时间

    以下 DF 表示从用户收到的事件 用户 ID 和事件时间戳 id timestamp 0 1 2020 09 01 18 14 35 1 1 2020 09 01 18 14 39 2 1 2020 09 01 18 14 40 3 1 2
  • 通过 Python 获取 MAPLE 的输出

    如何使用 Python 中的 subprocess 模块启动 MAPLE 的命令行实例以将输出提供并返回到主代码 例如我想要 X 1 1 print MAPLE X 返回值 2 我见过的最好的方法是围绕 MAPLE 命令的 SAGE 包装器
  • 使用 Pybind11 将 Eigen::Tensor 暴露给 Python

    我正在尝试使用 pybind11 将特征张量暴露给 python 我可以毫无问题地编译所有内容 并可以成功地将其导入到 python 中 但是 数据无法转换为python类型 我尝试了两种方法 一是直接公开数据 二是使用映射 两者都在 py