类型映射资源以及将列表转换为向量(以及反之)

2023-12-19

我正在使用 SWIG 将 c++ 包装在 python 中,并且需要使用类型映射以使我的 python 脚本尽可能简单。作为第一次尝试,我只是发送 2 个列表,将它们转换为向量,将两个向量相加,然后将结果返回到新列表中。

我的问题是,我发现 SWIG 手册没有太多指导意义,很难理解,并且没有给出任何可靠、完整的示例来说明如何编写自己的类型映射。

我的问题是:

  1. 我将如何确保我的列表正确转换为向量,然后再转换回来?
  2. 对于如何编写类型映射以及所有语法/函数的含义,是否有更好的教程/参考?

这是我的代码:

添加数组.h

#include <vector>
#include <functional>

std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2);

添加数组.i

%module add_array
%{
#include "add_array.h"
%}

%include std_vector.i 
%template(vectorInt) std::vector<int>;

%include "add_array.h"

添加数组.cpp

#include "add_array.h"
#include <cassert>
#include <cstring>

std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2) {  
  assert(src1.size() == src2.size());
  std::vector<int> dst;
  dst.resize(src1.size());

  for (size_t i = 0; i < src1.size(); i++) {
    dst[i] = src1[i] + src2[i];
  }
  return dst;
}

Makefile

all:
rm -f *.so *.o *_wrap.* *.pyc *.gch add_array.py
swig -c++ -python add_array.i
g++ -fpic -c add_array_wrap.cxx add_array.h add_array.cpp -I/home/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
g++ -shared add_array_wrap.o add_array.o -o _add_array.so

array.py (这是我正在运行的文件)

import add_array

a = [1, 2, 3, 4, 5, 6]
b = [5, 6, 7, 8, 9, 10]
c = add_array.add_array(a, b)
print(c)

Output:(6、8、10、12、14、16)

这是作为一个元组出现的(我希望它是一个列表)。 看起来我很幸运它可以将输入列表转换为向量(而在另一个方向则不太幸运),但我真的很想知道这是如何发生的以及如果需要的话如何为未来的代码更改它。

Thanks!


我不知道是否有具体原因,但其中包括std_vector.i将输出向量转换为元组而不是列表。如果您想要一个列表,则需要编写自定义类型映射。

示例(无错误检查):

%module add_array
%{
#include "add_array.h"
%}

%include <std_vector.i>
%template(vectorInt) std::vector<int>;

// Override the template output typemap with one that returns a list.
// An "out" typemap controls how a value is returned.
// When a function returns std::vector<int> this template will convert it to
// a Python object.  In this case, a PyList.
// 
// Note: PyObject* tmp declares a local variable that will be used by this code snippet.
// Make sure to look at the generated wrapper code and find the add_array_wrap function
// and how this code is integrated into it.
// 
%typemap(out) std::vector<int> (PyObject* tmp) %{

    // Allocate a PyList object of the requested size.
    // $1 references the first type in the type list (in this case, std::vector<int>)
    // and represents the c++ return value of a function that returns
    // this type; therefore, we can call methods on that value to get the size.
    //
    // Note: The elements of the new PyList are null pointers and MUST be
    //       populated before returning it to Python.
    //
    tmp = PyList_New($1.size());

    // Populate the PyList.  PyLong_FromLong converts a C++ "long" to a
    // Python PyLong object.  PyList_SET_ITEM takes a PyList object (tmp),
    // an index (i), and a Python object to put in the list.  This particular
    // function *steals* the reference to the Python object, so you don't have to
    // Py_DECREF the object to free it later.
    //
    for(int i = 0; i < $1.size(); ++i)
        PyList_SET_ITEM(tmp,i,PyLong_FromLong($1[i]));

    // $result is where you assign the Python object that should be returned
    // after converting the C++ $1 object.  SWIG_Python_AppendOutput is not
    // well-documented, but it appends the return object to an existing
    // returned object.  It's most useful for "argout" typemaps where multiple
    // output or in/out arguments in C++ can be returned as a tuple of
    // return values in Python.  For example, a function like:
    //
    //     void func(int* pValue1, int* pValue2);
    //
    // would normally return None ($result = Py_None), but an "argout" typemap
    // could *$1 to a PyLong and use SWIG_Python_AppendOutput to add it to
    // the result.  The template would be applied twice and you'd get a tuple.
    //
    $result = SWIG_Python_AppendOutput($result,tmp);
%}

%include "add_array.h"

Output:

>>> import add_array
>>> add_array.add_array([1,2,3],[4,5,6])
[5, 7, 9]

就教程而言,我只阅读过 SWIG 文档和 C 语言扩展的特定语言文档。就文档而言,它实际上相当不错,但您不能只是挑选要阅读的内容。研究前十几节的基础知识,然后跳到特定于语言的部分(例如 Python)。 SWIG 安装下也有一个 Examples 目录。

参考:

  • PyLong_FromLong https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong
  • PyList_New https://docs.python.org/3/c-api/list.html?highlight=pylist_new#c.PyList_New
  • PyList_SET_ITEM https://docs.python.org/3/c-api/list.html?highlight=pylist_new#c.PyList_SET_ITEM
  • 标准向量.i http://www.swig.org/Doc3.0/SWIGDocumentation.html#Library_std_vector

您必须查看 SWIG 源才能获取有关 SWIG_Python_AppendOutput 的任何信息。或者只是谷歌搜索其他例子。

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

类型映射资源以及将列表转换为向量(以及反之) 的相关文章

  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • 如何读取多个文件并将它们合并到一个 pandas 数据框中?

    我想读取位于同一目录中的多个文件 然后将它们合并到一个 pandas 数据框中 如果我这样做的话它会起作用 import pandas as pd df1 pd read csv data 12015 csv df2 pd read csv
  • 数据类和属性装饰器

    我一直在阅读 Python 3 7 的数据类 作为命名元组的替代品 我通常在必须将数据分组到结构中时使用它 我想知道数据类是否与属性装饰器兼容 以便为数据类的数据元素定义 getter 和 setter 函数 如果是这样 是否在某处进行了描
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 从函数在 python 3 中创建全局变量

    我想知道为什么在函数结束后我无法访问变量 variable for raw data 代码是这样的 def htmlfrom Website URL import urllib request response urllib request
  • model.predict() 返回类而不是概率

    Hello 我是第一次使用 Keras 我训练并保存了一个模型 作为 json 文件及其权重 该模型旨在将图像分为 3 个类别 我的编译方法 model compile loss categorical crossentropy optim
  • 如何使用 QAbstractTableModel(模型/视图)将数据设置到 QComboBox?

    我希望能够设置itemData of a combobox当使用填充时QAbstractTableModel 但是 我只能从模型返回一个字符串data method 通常 当不使用模型时 可以像这样执行 Set text and data
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • 如何从 Anaconda 更新 Pandas 以及最后是否可以使用 eclipse

    我已经使用以下文档通过 Anaconda 安装了 Python http www kevinsheppard com images 0 09 Python introduction pdf http www kevinsheppard co
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 无法将 librosa 与 python 3 一起使用

    我已经在 Windows 上的 ubuntu 子系统上使用 pip3 正确安装了 librosa 但是当我尝试执行像这样的简单程序时 import librosa data sr librosa load sound mp3 print d
  • 如何正确地将十六进制转义添加到字符串文字中?

    当你有C语言的字符串时 你可以在里面直接添加十六进制代码 char str abcde a b c d e 0x00 char str2 abc x12 x34 a b c 0x12 0x34 0x00 这两个示例在内存中都有 6 个字节
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究
  • 如何从 Pandas 数据框函数调用中回顾之前的行?

    我正在研究 回测交易系统 我有一个包含 OHLC 数据的 Pandas 数据框 并添加了几个计算列 https stackoverflow com questions 12376863 adding calculated columns t
  • 清理 TPL 中的 CallContext

    根据我使用的是基于 async await 的代码还是基于 TPL 的代码 我在逻辑清理方面得到了两种不同的行为CallContext 我可以设置和清除逻辑CallContext如果我使用以下异步 等待代码 正如我所期望的 class Pr

随机推荐

  • sqlite3 从 C 批量插入?

    我遇到了 import 命令来执行此操作 批量插入 但是是否有一个可以使用 sqlite3 exec 执行的查询版本 我只想将一个小文本文件内容复制到表中 下面这个的查询版本 import demotab txt mytable Sqlit
  • 在 ActionbarSherlock 中设置进度条样式

    ActionbarSherlock 中的水平进度条太细 很难看到 我怎样才能将其设计得厚一些像素 我尝试通过继承 Widget Sherlock Light ProgressBar Horizo ntal 的样式来在 styles xml
  • 流畅的 NHibernate 一对多关系设置外键为 null

    我有一个简单的 Fluent NHibernate 模型 其中包含两个相关的类 public class Applicant public Applicant Tags new List
  • Django模型表单过滤器查询集

    我有以下模型 class Article models Model title models CharField description models TextField author models ForeignKey User clas
  • 使用JQuery在Head标签中添加元数据

    我正在尝试在 Head 中插入一个新的元标记 我使用的内容管理系统不允许在 Head 中进行编辑 因此我尝试使用 jQuery 来执行此操作 不幸的是我不能工作 这是我添加到以下网页的代码 http www newcastlegateshe
  • Handlebars:访问已被拒绝解析“来自”的属性,因为它不是其父级的“自己的属性”

    我正在使用 Nodejs 后端 并使用把手进行服务器端渲染 读完一篇后doc车把中的对象数组 其中包含键 content 和 from 但是当我尝试使用 each循环遍历对象数组 出现错误 Handlebars 解析属性 from 的访问被
  • Twilio 视频将参与者静音

    由于新的 Twilio 视频 API 和缺乏文档 我无法弄清楚如何在视频通话中将参与者 甚至是本地参与者 静音 请帮忙 控制单个设备的静音 取消静音或暂停 取消暂停状态LocalAudioTrack of LocalVideoTrack 您
  • MyBatis Spring MVC 错误:无效的绑定语句(未找到)

    这是我尝试使用 MyBatis 执行简单查询时的堆栈跟踪 org apache ibatis binding BindingException Invalid bound statement not found com my package
  • Rails 3:通过API向用户返回大量数据

    我的应用程序有一个 API 用户可以请求数据 有时 这些数据需要时间来处理 并且会破坏我的代码 我需要一个解决方案 我正在考虑使用delayed job 但我不确定这是如何工作的 如果用户提出请求 我需要给他一个答案 即使我在后台处理数据
  • 在 WCF 客户端中查找 Stream 对象的长度?

    我有一个 WCF 服务 它使用上传文档Stream class 现在在此之后 我想获取文档的大小 流的长度 以更新文件大小的文件属性 但这样做时 WCF 会抛出异常 Document Upload Exception System NotS
  • Excel:列/行/矩阵之间数据转换的公式

    是否有公式将列中的数据转换为矩阵或行 以及从 到其他组合的转换 更复杂的情况又如何 将宽度为 W 的矩阵重塑为宽度为 N W 的矩阵 还有一些类似或相关的问题 我已经回答了其中一些 标有 我不断更新此列表 因为添加了新的类似 或相同 问题
  • 更新大型 CakePHP 模型,但*不*触及某些字段?

    使用 CakePHP 1 3 我在 CakePHP 中有一个相当大的模型 我希望在表单页面上有一些隐藏元素 以便在保存之前 手动 进行比较 验证 但是当执行saveAll 经过验证 我不希望出现这些字段 本质上是为了避免它们被更新 处理这个
  • Angular2-如何将表单上的“touched”属性设置为 true

    我的组件中有一个反应式表单 我想设置touched每个输入的属性等于true 我当前的代码执行此操作 但它会引发错误Cannot set property touched of
  • 如何在不使用任何操作类的情况下使用 Struts2 约定

    在Struts2中我们可以定义action而不使用action类struts xml如下
  • Django 中的双外键?

    有没有办法在 Django 中模拟双外键 例如 如果我有表格 音频 覆盖 html 表 timeline item 它有一个字段 id 以及一个指定音频 覆盖或 html 的字段类别 有谁知道我将如何在 Django 中对此进行建模 或者是
  • 将选择结果转换为插入脚本 - SQL Server

    我有 SQL Server 2008 SQL Server Management Studio 我需要从一个数据库中的表中选择数据并将其插入到另一个数据库中的另一个表中 如何将我的选择返回的结果转换为INSERT INTO 评论澄清 虽然我
  • 如何复制 Core Data 托管对象?

    我有一个托管对象 A 其中包含各种属性和关系类型 并且它的关系也有自己的属性和关系 我想做的是 复制 或 复制 以对象 A 为根的整个对象图 从而创建一个与 A 非常相似的新对象 B 更具体地说 B 或其子级 包含的任何关系都不应指向与 A
  • 使用水平滚动条滚动面板

    如何将水平滚动条应用于面板 我正在开发二维平铺地图编辑器 并使用面板来保存内容 当我的地图比面板大时 它就会消失并变得不可见 是否可以应用自定义滚动条 The Panel http msdn microsoft com en us libr
  • 如何在c#中查找名称以某个字符串开头的HTML元素的数量?

    我不确定该主题是否很好地描述了我的问题 但我正在使用 jQuery 动态创建一些 HTML 元素 文本框 而且我永远不知道将创建多少个元素 它循环通过数据库 然后我想获取后面代码中的所有元素并执行一些操作 将它们插入到另一个数据库中 我知道
  • 类型映射资源以及将列表转换为向量(以及反之)

    我正在使用 SWIG 将 c 包装在 python 中 并且需要使用类型映射以使我的 python 脚本尽可能简单 作为第一次尝试 我只是发送 2 个列表 将它们转换为向量 将两个向量相加 然后将结果返回到新列表中 我的问题是 我发现 SW