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

我正在尝试调用一个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数组。

展平numpy数组 - python

NumPy中是否有一种简单的方法来展平类型对象数组?我知道.flatten()方法将由相同大小的数组构造的非对象类型数组展平:I1 a = np.array([[1],[2],[3]]) I2 a.flatten() O2 array([1, 2, 3]) 但是,我无法将dtype = object数组展平:I4 b O4 array([[1], [2, 3…

在Numpy数组中替换子数组 - python

我正在尝试将Numpy数组中的子数组替换为形状相同的数组,以使所有更改都在两个数组中得到镜像。我在IDLE中运行了以下代码。import numpy a=numpy.zeros((2,1)) a array([[0.], [0.]]) b=numpy.zeros((1)) b array([0.]) a[0]=b b[0]=1 b array([1.]) 现…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…