ctypes 外部函数接口 (numpy.ctypeslib)#

numpy.ctypeslib.as_array(obj, shape=None)[源代码][源代码]#

从 ctypes 数组或 POINTER 创建一个 numpy 数组.

numpy 数组与 ctypes 对象共享内存.

如果从 ctypes POINTER 转换,则必须给出形状参数.如果从 ctypes 数组转换,则忽略形状参数.

numpy.ctypeslib.as_ctypes(obj)[源代码][源代码]#

从 numpy 数组创建并返回一个 ctypes 对象.实际上,任何暴露了 __array_interface__ 的对象都是被接受的.

numpy.ctypeslib.as_ctypes_type(dtype)[源代码][源代码]#

将 dtype 转换为 ctypes 类型.

参数:
dtypedtype

要转换的 dtype

返回:
ctype

一个 ctype 标量、联合体、数组或结构体

引发:
NotImplementedError

如果转换不可能

备注

这个函数在任何方向上都不能无损地往返.

np.dtype(as_ctypes_type(dt)) 将会:

  • 插入填充字段

  • 重新排序字段以按偏移量排序

  • 丢弃字段标题

as_ctypes_type(np.dtype(ctype)) 将会:

示例

转换一个简单的数据类型:

>>> dt = np.dtype('int8')
>>> ctype = np.ctypeslib.as_ctypes_type(dt)
>>> ctype
<class 'ctypes.c_byte'>

转换一个结构化数据类型:

>>> dt = np.dtype([('x', 'i4'), ('y', 'f4')])
>>> ctype = np.ctypeslib.as_ctypes_type(dt)
>>> ctype
<class 'struct'>
numpy.ctypeslib.load_library(libname, loader_path)[源代码][源代码]#

可以使用以下方法加载库:

>>> lib = ctypes.cdll[<full_path_name>] 

但是存在跨平台的考虑,例如库文件扩展名,加上 Windows 只会加载它找到的第一个具有该名称的库这一事实.NumPy 提供了 load_library 函数作为便利.

在 1.20.0 版本发生变更: 允许 libname 和 loader_path 接受任何 path-like object.

参数:
libnamepath-like

库的名称,可以有 ‘lib’ 作为前缀,但没有扩展名.

loader_pathpath-like

库可以被找到的地方.

返回:
ctypes.cdll[libpath]library 对象

一个 ctypes 库对象

引发:
OSError

如果没有具有预期扩展名的库,或者库有缺陷且无法加载.

numpy.ctypeslib.ndpointer(dtype=None, ndim=None, shape=None, flags=None)[源代码][源代码]#

数组检查 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

  • 可写 / W

  • 对齐 / 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_intc_longc_longlong 的别名.