gpt4 book ai didi

python - 来自 ndpointer 的结构数组到 NumPy 结构化数组 : np. ctypeslib.as_array

转载 作者:太空宇宙 更新时间:2023-11-03 21:25:02 24 4
gpt4 key购买 nike

我正在尝试调用一个 C 函数,该函数接受指向指针的指针并将其重定向到内部分配的一维数组,沿着这条线:

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 结构数组的最佳方式。

最佳答案

这可能被视为 ndpointer 中的错误 - 问题是 as_array 检查其参数是否是指针,但 ndpointer 测试失败,并且 numpy 尝试创建一个包含单个指针的数组(由于 numpy 没有指针类型而失败)。

你根本不使用 numpy 就可以过得很好:

class myStruct(ctypes.Structure):
_fields_ = [
('name', ctypes.c_char_p),
('status', ctypes.c_int),
]

arr = ctypes.POINTER(myStruct)()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))

# convert from `myStruct*` to `myStruct[size]`
arr = ctypes.cast(arr, ctypes.POINTER(myStruct * size.value)).contents

arr 现在是一个 ctypes 数组。

关于python - 来自 ndpointer 的结构数组到 NumPy 结构化数组 : np. ctypeslib.as_array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910589/

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