ctypes foreign function interface (numpy.ctypeslib)#
- numpy.ctypeslib.as_array(obj,shape=None)[source]#
Create a numpy array from a ctypes array or POINTER.
The numpy array shares the memory with the ctypes object.
The shape parameter must be given if converting from a ctypes POINTER.The shape parameter is ignored if converting from a ctypes array
Examples
Converting a ctypes integer array:
>>>importctypes>>>ctypes_array=(ctypes.c_int*5)(0,1,2,3,4)>>>np_array=np.ctypeslib.as_array(ctypes_array)>>>np_arrayarray([0, 1, 2, 3, 4], dtype=int32)
Converting a ctypes POINTER:
>>>importctypes>>>buffer=(ctypes.c_int*5)(0,1,2,3,4)>>>pointer=ctypes.cast(buffer,ctypes.POINTER(ctypes.c_int))>>>np_array=np.ctypeslib.as_array(pointer,(5,))>>>np_arrayarray([0, 1, 2, 3, 4], dtype=int32)
- numpy.ctypeslib.as_ctypes(obj)[source]#
Create and return a ctypes object from a numpy array. Actuallyanything that exposes the __array_interface__ is accepted.
Examples
Create ctypes object from inferred int
np.array:>>>inferred_int_array=np.array([1,2,3])>>>c_int_array=np.ctypeslib.as_ctypes(inferred_int_array)>>>type(c_int_array)<class 'c_long_Array_3'>>>>c_int_array[:][1, 2, 3]
Create ctypes object from explicit 8 bit unsigned int
np.array:>>>exp_int_array=np.array([1,2,3],dtype=np.uint8)>>>c_int_array=np.ctypeslib.as_ctypes(exp_int_array)>>>type(c_int_array)<class 'c_ubyte_Array_3'>>>>c_int_array[:][1, 2, 3]
- numpy.ctypeslib.as_ctypes_type(dtype)[source]#
Convert a dtype into a ctypes type.
- Parameters:
- dtypedtype
The dtype to convert
- Returns:
- ctype
A ctype scalar, union, array, or struct
- Raises:
- NotImplementedError
If the conversion is not possible
Notes
This function does not losslessly round-trip in either direction.
np.dtype(as_ctypes_type(dt))will:insert padding fields
reorder fields to be sorted by offset
discard field titles
as_ctypes_type(np.dtype(ctype))will:discard the class names of
ctypes.Structures andctypes.Unionsconvert single-element
ctypes.Unions into single-elementctypes.Structuresinsert padding fields
Examples
Converting a simple dtype:
>>>dt=np.dtype(np.int8)>>>ctype=np.ctypeslib.as_ctypes_type(dt)>>>ctype<class 'ctypes.c_byte'>
Converting a structured 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]#
It is possible to load a library using
>>>lib=ctypes.cdll[<full_path_name>]
But there are cross-platform considerations, such as library file extensions,plus the fact Windows will just load the first library it finds with that name.NumPy supplies the load_library function as a convenience.
Changed in version 1.20.0:Allow libname and loader_path to take anypath-like object.
- Parameters:
- libnamepath-like
Name of the library, which can have ‘lib’ as a prefix,but without an extension.
- loader_pathpath-like
Where the library can be found.
- Returns:
- ctypes.cdll[libpath]library object
A ctypes library object
- Raises:
- OSError
If there is no library with the expected extension, or thelibrary is defective and cannot be loaded.
- numpy.ctypeslib.ndpointer(dtype=None,ndim=None,shape=None,flags=None)[source]#
Array-checking restype/argtypes.
An ndpointer instance is used to describe an ndarray in restypesand argtypes specifications. This approach is more flexible thanusing, for example,
POINTER(c_double), since several restrictionscan be specified, which are verified upon calling the ctypes function.These include data type, number of dimensions, shape and flags. If agiven array does not satisfy the specified restrictions,aTypeErroris raised.- Parameters:
- dtypedata-type, optional
Array data-type.
- ndimint, optional
Number of array dimensions.
- shapetuple of ints, optional
Array shape.
- flagsstr or tuple of str
Array flags; may be one or more of:
C_CONTIGUOUS / C / CONTIGUOUS
F_CONTIGUOUS / F / FORTRAN
OWNDATA / O
WRITEABLE / W
ALIGNED / A
WRITEBACKIFCOPY / X
- Returns:
- klassndpointer type object
A type object, which is an
_ndtprinstance containingdtype, ndim, shape and flags information.
- Raises:
- TypeError
If a given array does not satisfy the specified restrictions.
Examples
>>>clib.somefunc.argtypes=[np.ctypeslib.ndpointer(dtype=np.float64,...ndim=1,...flags='C_CONTIGUOUS')]...>>>clib.somefunc(np.array([1,2,3],dtype=np.float64))...
- classnumpy.ctypeslib.c_intp#
A
ctypessigned integer type of the same size asnumpy.intp.Depending on the platform, it can be an alias for either
c_int,c_longorc_longlong.