如何访问作为 numpy 数组传递给 ctypes 回调的数组?

2024-04-01

我正在尝试使用 numpy 和 ctypes 将一些用 C 编写的数字代码集成到 Python 库中。我已经开始进行实际计算,但现在想将算法中间步骤的进度报告给 Python 代码中的回调函数。虽然我可以成功调用回调函数,但无法检索x数组传递给回调。在回调中,x is an ndpointer我似乎无法取消引用的对象。

当前代码

考虑这个最小的例子:

test.h:

typedef void (*callback_t)(
    double *x,
    int n
);

void callback_test(double* x, int n, callback_t callback);

test.c:

#include "test.h"

void callback_test(double* x, int n, callback_t callback) {
    for(int i = 1; i <= 5; i++) {

        for(int j = 0; j < n; j++) {
            x[j] = x[j] / i;
        }

        callback(x, n);
    }
}

test.py:

#!/usr/bin/env python

import numpy as np
import numpy.ctypeslib as npct
import ctypes
import os.path

array_1d_double = npct.ndpointer(dtype=np.double, ndim=1, flags='CONTIGUOUS')

callback_func = ctypes.CFUNCTYPE(
    None,            # return
    array_1d_double, # x
    ctypes.c_int     # n
)

libtest = npct.load_library('libtest', os.path.dirname(__file__))
libtest.callback_test.restype = None
libtest.callback_test.argtypes = [array_1d_double, ctypes.c_int, callback_func]


@callback_func
def callback(x, n):
    print("x: {0}, n: {1}".format(x, n))


if __name__ == '__main__':
    x = np.array([20, 13, 8, 100, 1, 3], dtype=np.double)
    libtest.callback_test(x, x.shape[0], callback)

电流输出

编译并运行脚本后,我得到以下输出:

x: <ndpointer_<f8_1d_CONTIGUOUS object at 0x7f9b55faba70>, n: 6
x: <ndpointer_<f8_1d_CONTIGUOUS object at 0x7f9b55faba70>, n: 6
x: <ndpointer_<f8_1d_CONTIGUOUS object at 0x7f9b55faba70>, n: 6
x: <ndpointer_<f8_1d_CONTIGUOUS object at 0x7f9b55faba70>, n: 6
x: <ndpointer_<f8_1d_CONTIGUOUS object at 0x7f9b55faba70>, n: 6

我也尝试过子集运算符x[0:n](类型错误:'ndpointer_x.value(以数字形式返回指针)。

黑客解决方案

如果我使用以下替代定义callback_func:

callback_func = ctypes.CFUNCTYPE(
    None,            # return
    ctypes.POINTER(ctypes.c_double), # x
    ctypes.c_int     # n
)

以及以下替代回调函数:

@callback_func
def callback(x, n):
    print("x: {0}, n: {1}".format(x[:n], n))

我得到了想要的结果:

x: [20.0, 13.0, 8.0, 100.0, 1.0, 3.0], n: 6
x: [10.0, 6.5, 4.0, 50.0, 0.5, 1.5], n: 6
x: [3.3333333333333335, 2.1666666666666665, 1.3333333333333333, 16.666666666666668, 0.16666666666666666, 0.5], n: 6
x: [0.8333333333333334, 0.5416666666666666, 0.3333333333333333, 4.166666666666667, 0.041666666666666664, 0.125], n: 6
x: [0.16666666666666669, 0.10833333333333332, 0.06666666666666667, 0.8333333333333334, 0.008333333333333333, 0.025], n: 6

我的问题

有没有更 numpy 式的访问方式x在回调中?而不是下标然后转换回numpy.array,我更愿意访问 ndpointer 指向的数据,因为我想限制 ndpointer 的副本数量x(并且为了优雅的代码)

I've 上传了要点 https://gist.github.com/sseemayer/7246463如果您想在我的代码上进行实验,请查看整个迷你示例。


我找到了一个解决方案,使用ctypes.POINTER(ctypes.c_double) and numpy.ctypeslib.as_array http://docs.scipy.org/doc/numpy/reference/routines.ctypeslib.html#numpy.ctypeslib.as_array- 根据 numpy.ctypeslib 文档,这将与数组共享内存:

callback_func = ctypes.CFUNCTYPE(
    None,            # return
    ctypes.POINTER(ctypes.c_double), # x
    ctypes.c_int     # n
)

[...]

@callback_func
def callback(x, n):
    x = npct.as_array(x, (n,))
    print("x: {0}, n: {1}".format(x, n))

任何有更优雅解决方案的人,也许使用ndpointer物体?

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

如何访问作为 numpy 数组传递给 ctypes 回调的数组? 的相关文章

随机推荐

  • Mac 上 OpenGL 中的多线程视频渲染显示严重的闪烁问题

    我有一个视频播放器应用程序 并使用多个线程以保持用户交互仍然流畅 解码视频的线程最初只是将生成的帧作为 BGRA 写入 RAM 缓冲区 该缓冲区由 glTexSubImage2D 上传到 VRAM 对于普通视频来说效果足够好 但正如预期的那
  • 将 gtest 与 xcode 结合使用

    我正在尝试在我的计算机上设置一个 C 单元测试库 并认为 google 的 gtest 会很合适 我目前正在使用最新版本的 xcode 运行 mountain lion 我一直在尝试按照发现的说明进行操作here http code goo
  • iOS 13 SwiftUI:应用程序在真实设备上启动时崩溃

    在 SwiftUI 和 Apple 的新测试版 macOS 10 15 iOS 13 和 Xcode 11 发布后 我开始开发基于新技术的应用程序 考虑到所有涉及的软件和系统都处于测试阶段 开发进展顺利 然而 当尝试在真实设备 iPhone
  • 使用 System.Text.Json 反序列化匿名类型

    我正在更新 NET Core 3 x 的一些应用程序 作为其中的一部分 我正在尝试从Json NET到新的System Text Json类 使用 Json NET 我可以反序列化匿名类型 如下所示 var token JsonConver
  • 优化三角矩阵计算的 CUDA 内核的执行

    我正在开发我的第一个 Cuda 应用程序 并且我的内核 吞吐量低于预期 这似乎是目前最大的瓶颈 内核的任务是计算一个 N N 大小的矩阵 DD 包含数据矩阵上所有元素之间的平方距离 数据矩阵 Y 的大小为 N D 以支持多维数据 并存储为行
  • Java:检测图像格式、调整大小(缩放)并另存为 JPEG

    这是我的代码 它实际上有效 虽然不完美 但确实有效 问题是调整大小的缩略图没有粘贴在白色绘制的矩形上 破坏了图像的长宽比 这是代码 有人可以建议我修复吗为了它 好吗 谢谢 import java awt Color import java
  • Selenium2 + phpunit -> 拖放到 xpath 上

    我使用 PHPUnit Extensions Selenium2TestCase Selenium 和 phpunit 我需要在不同的 emelent 上拖放一个 xpath 元素 就像在此屏幕上一样 更改树 类别树 上的位置 srcDra
  • 使用 malloc() 和 sizeof() 在堆上创建结构体

    我正在尝试使用 malloc 和 sizeof 在堆上创建一个结构 这是我的代码 include
  • 在 C# 中使用 imagemagick.net 在图像上应用水印

    我正在使用以下代码来调整图像大小 现在 我需要使用此图像应用水印魔法网 https magick codeplex com var response client GetObject request ResponseStream Magic
  • OpenSSL HMAC-SHA1 摘要与加密的不匹配

    我花了过去 6 个小时来实现消息签名算法 它根本不起作用 这是生成摘要的 PHP 代码 payload thisisanapple signature hash hmac sha1 payload thisisarandomkey data
  • Eclipse 中的 SSL 密钥库路径

    在我的用户主目录中有一个 keystore文件 每当我这样做时keytool list I get Keystore type JKS Keystore provider SUN Your keystore contains 0 entri
  • 循环中的动作链仅工作一次(Selenium/Python)

    I m trying to implement a cookie clicker bot Cookie clicker it s just a stupid simple game where you can click on the co
  • 实体框架和 SQL Server 2012 分页

    SQL Server 2012 引入了一种使用 FETCH 和 OFFSET 的更有效的分页机制 这可能会对使用大量分页的应用程序的性能产生重大影响 实体框架 5 支持吗 因此 如果我使用 EF 通过 Take Skip 进行分页 如果 E
  • 检查来自 Alamofire 和 Swift 的多个异步响应

    我正在编写一个应用程序 该应用程序依赖于来自各个站点 服务的数据 并涉及根据来自这些不同来源的数据执行计算以生成最终产品 我编写了一个示例类 其中包含下面的两个函数 用于从两个来源收集数据 我选择使函数不同 因为有时我们根据源应用不同的身份
  • 可折叠树示例中的 d3.js v4 古怪链接转换

    如果您玩下面的可折叠树 您会发现当您到达树的末尾并展开和折叠节点时 这些线正在做一些古怪的事情 我不完全确定是什么驱动了这种行为 或者我的重写是否的在此输入链接描述 https bl ocks org mbostock 4339083完全没
  • 车把示例不起作用

    在我的节点服务器提供的 hbs 中 在我的客户端 JavaScript 文件中 var source entry template html var template Handlebars compi
  • SQLAlchemy 中的信号或触发器

    SQLAlchemy 是否有类似于 Django 信号概念的东西 基本上 我想在预保存或后保存某些实体对象时触发一些函数 谢谢 编辑 我只是想要 SQLAlchemy 中的 django signals 的等效项 我认为您正在寻找 ORM
  • 错误 3219 - 无效操作

    我尝试在 Access 项目中编写查询 但在 SQL 查询所在的行中发生此运行时错误 这是我的代码 Private Sub Befehl80 Click Dim rst As DAO Recordset Set rst CurrentDb
  • Autofixture 声明性自动数据参数属性的集合大小

    如何使用 Autofixture 的声明性参数样式传递到测试的属性上的属性来指定列表 枚举的长度 大小 我希望能够在不将参数移入测试主体的情况下使该测试通过 Theory AutoData public void CollectionSiz
  • 如何访问作为 numpy 数组传递给 ctypes 回调的数组?

    我正在尝试使用 numpy 和 ctypes 将一些用 C 编写的数字代码集成到 Python 库中 我已经开始进行实际计算 但现在想将算法中间步骤的进度报告给 Python 代码中的回调函数 虽然我可以成功调用回调函数 但无法检索x数组传