python - 结构数组到 NumPy 结构化数组:来自 ndpointer 的 np.ctypeslib.as_array
问题描述
我正在尝试调用一个接受指向指针的指针并将其重定向到内部分配的一维数组的 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 - 使用 REST 从 cars.com 提取数据
- python - Python在线程中加载动画给出分段错误
- ios - 如何在 Swift 上使这段代码异步
- tensorflow - 无法打开文件 mnist.h5
- ibm-mq - IBM Websphere MQ:未能授权“mqadmin”
- database - XPath 错误 - 试图从数据库中按名称获取用户
- python - 使用 Simple Imputer 用平均值填充空行时出错
- c# - ASP.NET MVC。通过Get(form)发送数据并在一个标签中返回成功?(如何发送和返回数据到同一个视图)
- netlogo - 如何在netlogo中将图提取为图形?
- r - R - 对长格式数据帧中的 id 标识的小标题运行回归