gpt4 book ai didi

python - 从 ctypes 数组中获取数据到 numpy

转载 作者:太空宇宙 更新时间:2023-11-04 14:10:25 25 4
gpt4 key购买 nike

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

我使用的包装对数组数据进行两种不同类型的返回(我特别感兴趣):

  • ctypes阵列:当我做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] 这样的数据建立索引。 ,但我只能通过一个 super 笨拙的方式将它变成 numpy:

    >>> np.frombuffer(np.core.multiarray.int_asbuffer(
    ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))

我在一个旧的 numpy 中找到了这个邮件列表 thread from Travis Oliphant , 但不在 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“缓冲协议(protocol)”的对象,然后使用该缓冲对象创建一个 NumPy 数组。您通过未记录的 int_asbuffer() 函数在帖子中提供了一种创建缓冲区对象的方法:

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

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

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

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

a = numpy.frombuffer(buffer, float)

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

恐怕它不会比这更容易,但它并没有那么糟糕,你不觉得吗?您可以将所有丑陋的细节隐藏在包装函数中,而不必再担心了。

关于python - 从 ctypes 数组中获取数据到 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com