NumPy结构化数组的结构数组:ndpointer的np.ctypeslib.as_array

时间:2018-12-24 07:42:31

标签: python numpy ctypes structured-array

我试图调用一个C函数,该函数接受一个指向指针的指针,并将其重定向到内部分配的1D数组,沿着该行:

typedef myStruct {
    const char* name;
    int status;
} myStruct;

int foo(const myStruct** array, size_t* size);

我正在尝试使用Python和NumPy对其进行包装,并获得一个NumPy数组来包装该内部内存(只读)。

我有以下内容:

arr = np.ctypeslib.ndpointer(dtype=np.dtype([('name', np.intp),
                                             ('status', np.int)]))()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))
arr = np.ctypeslib.as_array(arr, shape=(size.value,))
arr.flags.writeable = False # not our memory!

_call()是用于检查返回值的包装器。

我得到以下信息:

ValueError: '<P' is not a valid PEP 3118 buffer format string

在对as_array()的呼叫中。我在做什么错了?


编辑:我的目标是将数据读取为NumPy结构化数组,因为我认为这是在python中描述C结构数组的最佳方法。

1 个答案:

答案 0 :(得分:0)

这可能被视为, and中的错误-问题是for(int j=start+i;j<=m;j=j+i) 检查其参数是否为指针,但是该测试对ndpointer失败,并且numpy尝试创建一个包含单个指针的数组(由于numpy没有指针类型,所以失败)。

您完全不需要使用numpy就可以了:

ndpointer

as_array现在是ctypes数组。