从ctypes指针到结构数组的NumPy结构化/常规数组

时间:2016-09-05 10:04:38

标签: python numpy ctypes

说我有以下C功能:

void getArrOfStructs(SomeStruct** ptr, int* numElements)

以下C结构:

typedef struct SomeStruct
{
    int x;
    int y;
};

我能够成功获得Python列表:

class SomeStruct(Structure):
    _fields_ = [('x', c_int),
                ('y', c_int)]
ptr, numElements = pointer(SomeStruct()), c_int()
myDLL.getArrOfStructs(byref(ptr), byref(numElements)))

我想获得一个NumPy结构化/常规数组。

  1. 结构化与规则数组:哪一个更好(就术语而言)?
  2. 我该怎么办?我正在寻找一种有效的方法(不需要复制每个单元格)。我尝试了NumPy的frombuffer()函数,但只能将它与常规C数组一起使用。

1 个答案:

答案 0 :(得分:1)

numpy数组的视图共享一个数据缓冲区

In [267]: x=np.arange(6).reshape(3,2)
In [268]: x.tostring()
Out[268]: b'\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00'
In [269]: x.view('i,i')
Out[269]: 
array([[(0, 1)],
       [(2, 3)],
       [(4, 5)]], 
      dtype=[('f0', '<i4'), ('f1', '<i4')])

在此示例中,数据缓冲区是一个24字节的C数组,可以通过各种方式查看 - 平面数组,2列或带有2个字段的结构化数组。

我还没有与ctypes合作,但我确定有一些等同于np.frombuffer的东西可以从字节缓冲区构建一个数组。

In [273]: np.frombuffer(x.tostring(),int)
Out[273]: array([0, 1, 2, 3, 4, 5])
In [274]: np.frombuffer(x.tostring(),'i,i')
Out[274]: 
array([(0, 1), (2, 3), (4, 5)], 
      dtype=[('f0', '<i4'), ('f1', '<i4')])