当前位置: 首页 > 面试题库 >

从ctypes数组获取数据到numpy

嵇浩淼
2023-03-14
问题内容

我正在使用Python(通过ctypes)包装的C库来运行一系列计算。在运行的不同阶段,我想将数据放入Python,尤其是numpy数组。

我正在使用的包装对数组数据进行两种不同类型的返回(这对我特别有意义):

  • ctypes Array:当我这样做时type(x)(其中x是ctypes数组,我得到一个<class 'module_name.wrapper_class_name.c_double_Array_12000'>回报。我知道该数据是文档中内部数据的副本,我能够numpy轻松地将其放入数组中:
    >>> np.ctypeslib.as_array(x)
    

这将返回numpy数据的一维数组。

  • ctype 指向数据的指针:在这种情况下,从库的文档中可以了解到,我得到的是指向已存储并直接用于库的数据的指针。type(y)我得到乳清(其中y是指针)我得到<class 'module_name.wrapper_class_name.LP_c_double'>。在这种情况下,我仍然能够像这样对数据进行索引y[0][2],但是我只能通过一个超级笨拙的方法将其放入numpy中:
    >>> np.frombuffer(np.core.multiarray.int_asbuffer(
    ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
    

我在Travis Oliphant的一个旧numpy邮件列表线程中找到了这个,但是在numpy文档中却找不到。如果代替这种方法,我尝试如上所述,则会得到以下结果:

>>> np.ctypeslib.as_array(y)
...
...  BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'

这种np.frombuffer方法是最好的还是唯一的方法?我乐于接受其他建议,但仍必须使用,numpy因为我还有许多其他后处理代码,这些代码依赖于numpy我想与此数据一起使用的功能


问题答案:

从ctypes指针对象创建NumPy数组是有问题的操作。尚不清楚谁真正拥有指针指向的内存。什么时候可以再次释放?有效期有多长?只要有可能,我都会尽量避免这种构造。在Python代码中创建数组并将其传递给C函数比使用不认识Python的C函数分配的内存要容易得多,更安全。通过执行后者,您在某种程度上会否定使用高级语言进行内存管理的优势。

如果您确实确定有人会照顾内存,则可以创建一个暴露Python“缓冲区协议”的对象,然后使用此缓冲区对象创建一个NumPy数组。您通过未记录的int_asbuffer()函数给出了一种在帖子中创建缓冲区对象的方法:

buffer = numpy.core.multiarray.int_asbuffer(
    ctypes.addressof(y.contents), 8*array_length)

(请注意,我替换8np.dtype(float).itemsize。在任何平台上,它始终为8。)创建缓冲区对象的另一种方法是PyBuffer_FromMemory()通过ctypes从Python
C API调用该函数:

buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemory
buffer_from_memory.restype = ctypes.py_object
buffer = buffer_from_memory(y, 8*array_length)

对于这两种方式,您都可以通过以下方式创建一个NumPy数组buffer

a = numpy.frombuffer(buffer, float)

(我实际上不明白为什么要使用.astype()而不是第二个参数frombuffer;此外,我想知道为什么要使用np.int,而您之前说过数组包含doubles。)

恐怕它不会比这容易得多,但这还不是很糟糕,您不觉得吗?您可以将所有难看的细节掩埋在包装函数中,而不必担心它。



 类似资料:
  • 问题内容: 这是我从foursquare获得的JSON的一部分。 JSON格式 我需要获取最后的提示 文本 ,编写它的 用户 以及他编写/发布它的 日期 。 用户 :达米尔·P。 日期 :1314115358 文字 :健身中心 我尝试使用 JQuery ,这可以获取非数组值: 但这不适用于数组。 结果 :未捕获的TypeError:无法读取未定义的属性“文本”。 我也尝试了 $ .each ,但没

  • 问题内容: 我的页面如下: 和一个php文件来处理ajax请求; 但是,当我单击时,我得到的不是array [0]。我怎样才能解决这个问题?? 提前致谢… 问题答案: 您不能从js访问数组(php数组)try 和js

  • 问题内容: 我已经在数据库中编写了一个简单的函数。从我的源代码中,我像这样调用此函数 我的数据正确无误,但数据集的表头显示的是我的函数名(),而不是和。在这种情况下如何获取数据? 目前的输出是 但是我想输出如下: 我正在努力实现以下目标: 以下查询工作正常: 问题答案: 当函数返回结果集时,您应该使用。 不要将用于设置返回函数的调用放入选择列表。

  • 我需要从服务绑定模板数据变量。服务使用HTTP检索JSON格式的数据。我得到了正确的数据,但是因为请求是如此的异步返回服务总是未定义的。 如何将异步数据销售到模板中?不使用回调? AppComponent: 菜单提供者: 月经量: 模板:

  • 我有一个包含玩家数据的数组。这个数组根据玩家的数量而变化。数组看起来像这样: 我只想从每个玩家的数组中获取玩家名。我该怎么做?输出应该是如下所示的字符串:我在Internet或YouTube上没有找到任何内容。答案当然简单明了,但我还没有找到。 Im使用PHP 8.0.13。

  • 问题内容: 我的代码有问题。 像这样的情况: 我有一个下拉列表,如果选择“个人”,则会出现新的下拉列表,其中包含从数据库查询中检索到的数据;如果选择“公开”,则该下拉列表将消失。 这样的HTML代码: 查询如下: 像这样的JavaScript代码: 我不知道如何将值/结果发送到javascript代码(选择选项中的值和名称)。 问题答案: 在javascript中,您必须对您的php文件进行操作: