ctypes 外部函数接口 (numpy.ctypeslib
)#
- numpy.ctypeslib.as_array(obj, shape=None)[source]#
从 ctypes 数组或 POINTER 创建一个 numpy 数组。
numpy 数组与 ctypes 对象共享内存。
如果从 ctypes POINTER 转换,则必须给出 shape 参数。如果从 ctypes 数组转换,则忽略 shape 参数。
- numpy.ctypeslib.as_ctypes(obj)[source]#
从 numpy 数组创建并返回一个 ctypes 对象。实际上,任何公开 __array_interface__ 的对象都被接受。
- numpy.ctypeslib.as_ctypes_type(dtype)[source]#
将 dtype 转换为 ctypes 类型。
- 参数:
- dtypedtype
要转换的 dtype
- 返回值:
- ctype
ctype 标量、联合、数组或结构体
- 引发:
- NotImplementedError
如果转换不可行
备注
此函数在任一方向上都不会无损往返。
np.dtype(as_ctypes_type(dt))
将插入填充字段
重新排序字段以按偏移量排序
丢弃字段标题
as_ctypes_type(np.dtype(ctype))
将丢弃
ctypes.Structure
和ctypes.Union
的类名将单元素
ctypes.Union
转换为单元素ctypes.Structure
插入填充字段
示例
转换简单的 dtype
>>> dt = np.dtype('int8') >>> ctype = np.ctypeslib.as_ctypes_type(dt) >>> ctype <class 'ctypes.c_byte'>
转换结构化 dtype
>>> dt = np.dtype([('x', 'i4'), ('y', 'f4')]) >>> ctype = np.ctypeslib.as_ctypes_type(dt) >>> ctype <class 'struct'>
- numpy.ctypeslib.load_library(libname, loader_path)[source]#
可以使用以下方法加载库:
>>> lib = ctypes.cdll[<full_path_name>]
但是,存在跨平台的注意事项,例如库文件扩展名,以及 Windows 将加载它找到的第一个具有该名称的库的事实。NumPy 提供 load_library 函数作为一种便利。
版本 1.20.0 中更改: 允许 libname 和 loader_path 采用任何 路径类对象。
- 参数:
- libname路径类
库的名称,可以以“lib”为前缀,但没有扩展名。
- loader_path路径类
库可以在哪里找到。
- 返回值:
- ctypes.cdll[libpath]库对象
ctypes 库对象
- 引发:
- OSError
如果没有具有预期扩展名的库,或者库有缺陷且无法加载。
- numpy.ctypeslib.ndpointer(dtype=None, ndim=None, shape=None, flags=None)[source]#
数组检查 restype/argtypes。
ndpointer 实例用于在 restypes 和 argtypes 规范中描述 ndarray。这种方法比使用例如
POINTER(c_double)
更加灵活,因为可以指定多个限制,这些限制在调用 ctypes 函数时会进行验证。这些限制包括数据类型、维度数、形状和标志。如果给定的数组不满足指定的限制,则会引发TypeError
。- 参数:
- dtype数据类型,可选
数组数据类型。
- ndimint,可选
数组维度数。
- shape整数元组,可选
数组形状。
- flagsstr 或 str 元组
数组标志;可以是以下一个或多个:
C_CONTIGUOUS / C / CONTIGUOUS
F_CONTIGUOUS / F / FORTRAN
OWNDATA / O
WRITEABLE / W
ALIGNED / A
WRITEBACKIFCOPY / X
- 返回值:
- klassndpointer 类型对象
一个类型对象,它是包含 dtype、ndim、shape 和 flags 信息的
_ndtpr
实例。
- 引发:
- TypeError
如果给定的数组不满足指定的限制。
示例
>>> clib.somefunc.argtypes = [np.ctypeslib.ndpointer(dtype=np.float64, ... ndim=1, ... flags='C_CONTIGUOUS')] ... >>> clib.somefunc(np.array([1, 2, 3], dtype=np.float64)) ...
- class numpy.ctypeslib.c_intp#
与
numpy.intp
大小相同的ctypes
有符号整数类型。根据平台的不同,它可以是
c_int
、c_long
或c_longlong
的别名。