从ctypes数组获取数据到numpy

8 浏览
0 Comments

从ctypes数组获取数据到numpy

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

我使用的封装对于数组数据有两种不同的返回类型(这对我来说特别重要):

  • ctypes数组:当我执行type(x)(其中x是ctypes数组)时,返回。我知道这个数据是从文档中的内部数据复制的,并且我可以轻松地将它转换为numpy数组:

    >>> np.ctypeslib.as_array(x)
    

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

  • ctype指向数据的指针:在这种情况下,根据库的文档,我理解我得到的是指向存储和直接用于库的数据的指针。当我执行type(y)(其中y是指针)时,返回。在这种情况下,我仍然可以通过y[0][2]来索引数据,但是我只能通过一个非常尴尬的方式将其转换为numpy:

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

我在一个旧的numpy邮件列表Travis Oliphant的线程中找到了这个方法,但在numpy文档中没有找到。如果我尝试以上的方法,我会得到以下结果:

>>> np.ctypeslib.as_array(y)
...
...  一堆堆栈信息
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'

这种np.frombuffer方法是最好的或唯一的方法吗?我对其他建议持开放态度,但仍然希望使用numpy,因为我有很多其他的后处理代码依赖于numpy功能,我想将其与这些数据一起使用

0