说我有以下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结构化/常规数组。
frombuffer()
函数,但只能将它与常规C
数组一起使用。答案 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')])