python 使用数组定义结构

xfb7svmp  于 2023-01-12  发布在  Python
关注(0)|答案(1)|浏览(197)

我通常使用numpy数组,所以我在Python中定义了以下ctypes类型

arr_double = numpy.ctypeslib.ndpointer(dtype=np.double, flags='C_CONTIGUOUS')

然后在C中得到以下结构

struct mystruct {
    double *array;
    size_t size;
};

我尝试在Python中使用ctypes定义此结构,如下所示

class MyStruct(ctypes.Structure):
    _fields_ = [("array", arr_double), ("size", ctypes.c_size_t)]

然而,这给了我错误

second item in _fields_ tuple (index 2) must be a C type

在ctypes中定义这个结构的正确方法是什么?有没有方法可以使用numpy的ctypes类型?如果没有,我如何将numpy数组转换为“C类型”?

ttcibm8c

ttcibm8c1#

ctypes.Structure的元素必须是ctypes类型,但是可以使用numpy.ctypes.data_as将numpy数组转换为C类型:

import ctypes as ct
import numpy as np

PDOUBLE = ct.POINTER(ct.c_double)  # equivalent to C double*

class MyStruct(ct.Structure):
    _fields_ = (('array', PDOUBLE),
                ('size', ct.c_size_t))

    def __init__(self, arr):
        if not isinstance(arr, np.ndarray) or arr.dtype != 'float64' or arr.ndim != 1:
            raise TypeError('parameter 1 must be 1D numpy array of float64')
        self.array = arr.ctypes.data_as(PDOUBLE)
        self.size = len(arr)

    def __repr__(self):
        return f'MyStruct({self.array[:self.size]})'

arr = np.array([1., 2., 3.])
s = MyStruct(arr)
print(s)

输出:

MyStruct([1.0, 2.0, 3.0])

相关问题