将一组 NumPy 数组传递到 C 函数中进行输入和输出

2024-02-19

假设我们有一个 C 函数,它接受一组一个或多个输入数组,处理它们,并将其输出写入一组输出数组。签名如下所示(count表示要处理的数组元素的数量):

void compute (int count, float** input, float** output)

我想通过 ctypes 从 Python 调用此函数,并使用它对一组 NumPy 数组应用转换。对于单输入/单输出函数定义为

void compute (int count, float* input, float* output)

以下作品:

import ctypes
import numpy

from numpy.ctypeslib import ndpointer

lib = ctypes.cdll.LoadLibrary('./block.so')
fun = lib.compute
fun.restype = None
fun.argtypes = [ctypes.c_int,
                ndpointer(ctypes.c_float),
                ndpointer(ctypes.c_float)]

data = numpy.ones(1000).astype(numpy.float32)
output = numpy.zeros(1000).astype(numpy.float32)
fun(1000, data, output)

但是,我不知道如何创建相应的指针数组multiple输入(和/或输出)。有任何想法吗?

Edit: 所以人们一直想知道如何compute知道需要多少个数组指针(如count指每个数组的元素数量)。事实上,这是硬编码的;给定的compute准确地知道预期有多少输入和输出。调用者的工作是验证这一点input and output指向正确数量的输入和输出。这是一个例子compute获取 2 个输入并写入 1 个输出数组:

virtual void compute (int count, float** input, float** output) {
    float* input0 = input[0];
    float* input1 = input[1];
    float* output0 = output[0];
    for (int i=0; i<count; i++) {
        float fTemp0 = (float)input1[i];
        fRec0[0] = ((0.09090909090909091f * fTemp0) + (0.9090909090909091f * fRec0[1]));
        float fTemp1 = (float)input0[i];
        fRec1[0] = ((0.09090909090909091f * fTemp1) + (0.9090909090909091f * fRec1[1]));
        output0[i] = (float)((fTemp0 * fRec1[0]) - (fTemp1 * fRec0[0]));
        // post processing
        fRec1[1] = fRec1[0];
        fRec0[1] = fRec0[0];
    }
}

我无法影响签名和实施compute。我可以验证(从 Python!)需要多少输入和输出。关键问题是如何给出正确的argtypes该函数,以及如何在 NumPy 中生成适当的数据结构(指向 NumPy 数组的指针数组)。


要专门使用 Numpy 数组执行此操作,您可以使用:

import numpy as np
import ctypes

count = 5
size = 1000

#create some arrays
arrays = [np.arange(size,dtype="float32") for ii in range(count)] 

#get ctypes handles
ctypes_arrays = [np.ctypeslib.as_ctypes(array) for array in arrays]

#Pack into pointer array
pointer_ar = (ctypes.POINTER(C.c_float) * count)(*ctypes_arrays)

ctypes.CDLL("./libfoo.so").foo(ctypes.c_int(count), pointer_ar, ctypes.c_int(size))

C 方面的内容可能如下所示:

# function to multiply all arrays by 2
void foo(int count, float** array, int size)
{
   int ii,jj;
   for (ii=0;ii<count;ii++){
      for (jj=0;jj<size;jj++)
         array[ii][jj] *= 2;    
   }

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

将一组 NumPy 数组传递到 C 函数中进行输入和输出 的相关文章

随机推荐

  • 如何在Android中实现拖动幻灯片视图

    我需要能够将列表视图拖动到左侧并移出视图 同时暴露第一个列表视图下方的另一个列表视图 我该怎么做呢 您可以使用 OnTouchListener 并在 ACTION MOVE 上调整大小或移动某些视图 请记住调用 setClickable t
  • Android USB 主机 API 和 USB 存储

    我正在尝试使用 android 主机 api 进行 USB 存储 我对此有很多疑问 使用主机 API 一切皆有可能 我想查看 USB 的内容 如果可能的话 查看正常的文件操作 我没有找到任何与此相关的文档帮助 我可以使用 UsbDevice
  • Wix 的 util:CloseApplication 扩展似乎不起作用

    我试图在使用 Wix 卸载之前关闭一个进程 我已经确认 只要存在可见窗口 它就可以工作 但如果没有可见窗口 此应用程序大多数情况下都是这种情况 因为它是系统托盘应用程序 卸载程序就会挂起 并且最终继续卸载 使进程保持运行 根据这个论坛帖子
  • 下载 HTML 页面及其内容

    Does Python有什么方法可以下载整个HTML页面及其内容 图像 CSS 到给定 url 的本地文件夹 并更新本地 html 文件以在本地选择内容 您可以使用urllib http docs python org library ur
  • 在 Visual Studio Code 中将语言更改为 JSX

    立即使用 Visual Studio 代码在0 8版本上支持JSX https code visualstudio com Updates languages jsx colorization 但看起来激活它的唯一方法是使用 jsx文件扩展
  • 为什么不推荐react-router v6中的HashRouter?

    在每一个react routerv6 文档页面提到HashRouter有一个简短的警告文本指出不建议使用这种路由 没有解释为什么 有没有major缺点 它会以某种方式破坏任何 api 吗 简短的回答 一些开发人员认为哈希路由会产生 丑陋 的
  • 向skimage中的regionprops添加额外的属性

    我正在使用regionprops函数从scikit image or skimage 包使用同一包中的 SLIC 超像素算法来计算分割图像的区域特征 除了函数中计算的特征之外 我还需要其他特征 主要是 标准差 偏度 峰度 我修改了源代码 r
  • 在头文件中初始化可定制结构的向量

    有没有办法获得全局结构列表并在同一头文件中初始化包含它们的修改版本的向量 我知道我无法直接访问和编辑 h 文件中的变量 因为它不是运行时代码 但也许恰好有一个解决方法 或者可能是我碰巧跳过的一些非常基本的方法C 初学者手册 如果是的话请原谅
  • Android 在 webview 中启用后退按钮

    我正在使用以下代码在我的 Android 应用程序中显示 Web 视图 package com company myapp import com google android apps analytics GoogleAnalyticsTr
  • 许可方案、防欺骗和撤销功能

    这是我的第一个问题 所以请温柔一点 我正在开发一个软件 我想使用某种许可方案来保护该软件 一个基本方案是为用户生成一些 唯一 密钥 用户在想要注册该软件时发送该密钥和注册码并收到激活码 当应用程序运行时 它通过比较 唯一 密钥和通过解密激活
  • 从独立存储中的图像设置辅助平铺背景图像

    这是我从图像网址获取流的方法 using var httpClient new HttpClient response await httpClient GetStreamAsync new Uri IMAGEURL HERE UriKin
  • 在 T-SQL 中将特定 BigInt 转换为 DateTime

    我有 bigInt 635307578922100000我需要转换成DateTime 我尝试了几种方法来做到这一点 SELECT DATEADD S CONVERT bigint 635307578922100000 1000 CONVER
  • SPSite 站点 = new SPSite(SPContext.Current.Web.Url) 与 SPContext.Current.Web.Site

    为什么某些 SharePoint 示例使用 using SPSite site new SPSite SPContext Current Web Url 而不仅仅是简单地 SPSite site SPContext Current Web
  • 如何使用DELPHI更改Android设备通知中的小图标图像

    有没有办法用Delphi更改Android应用程序通知中的小图标图像 默认使用的应用程序图标 轻松创建通知的标准方法是 var aNotification TNotification begin aNotification aNotific
  • 在C++中查找进程中加载​​的DLL的内存地址

    我有一个正在使用 Test dll 的正在运行的进程 我想知道内存中 Test dll 开始的确切内存位置 但似乎无法 我的主要问题是我需要写入此 DLL 的偏移量 但当我使用 Read WriteProcessMemory 时 我无法准确
  • 为什么 MassTransit 消息传递中不允许使用结构体?

    消费者界面在MassTransit所有人都期望消息模型是类而不是结构 由于它们都是内部接口 我必须说那里的设计非常好 这是显示约束的通用容器类 直接获取从源代码来看 https github com MassTransit MassTran
  • C++ 打印当前函数输入参数类型、名称和值

    我正在寻找一种允许记录函数输入参数的功能 例如 void func std string input name const int n print current function s inputs type name and value
  • 获取 i18next 以回退到“无翻译”

    如果没有找到该键的翻译 默认情况下 i18next 翻译库似乎会回退到翻译键 例如 No translation defined for CANCEL yet i18next t CANCEL Returns CANCEL 如果没有找到该密
  • 如何动态创建变量? [复制]

    这个问题在这里已经有答案了 我想在Python中动态创建变量 有没有人有任何创造性的方法来做到这一点 除非非常需要创建一堆变量名称 否则我只会使用字典 您可以在其中动态创建键名称并将值与每个名称相关联 a k 0 while k lt 10
  • 将一组 NumPy 数组传递到 C 函数中进行输入和输出

    假设我们有一个 C 函数 它接受一组一个或多个输入数组 处理它们 并将其输出写入一组输出数组 签名如下所示 count表示要处理的数组元素的数量 void compute int count float input float output