ctypes foreign function interface (numpy.ctypeslib)#

numpy.ctypeslib.as_array(obj, shape=None)[источник]#

Создать массив numpy из массива ctypes или POINTER.

Массив numpy использует общую память с объектом ctypes.

Параметр shape должен быть указан при преобразовании из ctypes POINTER. Параметр shape игнорируется при преобразовании из ctypes array

Примеры

Преобразование целочисленного массива ctypes:

>>> import ctypes
>>> ctypes_array = (ctypes.c_int * 5)(0, 1, 2, 3, 4)
>>> np_array = np.ctypeslib.as_array(ctypes_array)
>>> np_array
array([0, 1, 2, 3, 4], dtype=int32)

Преобразование указателя ctypes POINTER:

>>> import ctypes
>>> 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_array
array([0, 1, 2, 3, 4], dtype=int32)
numpy.ctypeslib.as_ctypes(obj)[источник]#

Создать и вернуть объект ctypes из массива numpy. Фактически принимается всё, что предоставляет __array_interface__.

Примеры

Создать объект ctypes из выведенного целого числа np.array:

>>> inferred_int_array = np.array([1, 2, 3])
>>> c_int_array = np.ctypeslib.as_ctypes(inferred_int_array)
>>> type(c_int_array)

>>> c_int_array[:]
[1, 2, 3]

Создать объект ctypes из явного 8-битного беззнакового целого числа 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)

>>> c_int_array[:]
[1, 2, 3]
numpy.ctypeslib.as_ctypes_type(dtype)[источник]#

Преобразует dtype в тип ctypes.

Параметры:
dtypedtype

Тип данных для преобразования

Возвращает:
ctype

Скаляр, объединение, массив или структура ctype

Вызывает:
NotImplementedError

Если преобразование невозможно

Примечания

Эта функция не обеспечивает безошибочное преобразование в обоих направлениях.

np.dtype(as_ctypes_type(dt)) будет:

  • вставить поля заполнения

  • переупорядочить поля по смещению

  • отбросить заголовки полей

as_ctypes_type(np.dtype(ctype)) будет:

Примеры

Преобразование простого dtype:

>>> dt = np.dtype('int8')
>>> ctype = np.ctypeslib.as_ctypes_type(dt)
>>> ctype

Преобразование структурированного типа данных:

>>> dt = np.dtype([('x', 'i4'), ('y', 'f4')])
>>> ctype = np.ctypeslib.as_ctypes_type(dt)
>>> ctype

numpy.ctypeslib.load_library(libname, loader_path)[источник]#

Возможно загрузить библиотеку с помощью

>>> 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, флаги=None)[источник]#

Проверка типов возвращаемых значений/аргументов для массивов.

Экземпляр ndpointer используется для описания ndarray в спецификациях restypes и argtypes. Этот подход более гибкий, чем использование, например, POINTER(c_double), поскольку можно указать несколько ограничений, которые проверяются при вызове функции ctypes. Они включают тип данных, количество размерностей, форму и флаги. Если заданный массив не удовлетворяет указанным ограничениям, TypeError вызывается исключение.

Параметры:
dtypeтип данных, опционально

Тип данных массива.

ndimint, необязательный

Количество измерений массива.

shapeкортеж целых чисел, необязательный

Форма массива.

флагиstr или кортеж из str

Флаги массива; могут быть одним или несколькими из:

  • C_CONTIGUOUS / C / CONTIGUOUS

  • F_CONTIGUOUS / F / FORTRAN

  • OWNDATA / O

  • WRITEABLE / W

  • ALIGNED / A

  • WRITEBACKIFCOPY / X

Возвращает:
klassобъект типа ndpointer

Объект типа, который является _ndtpr экземпляр, содержащий информацию о dtype, ndim, shape и flags.

Вызывает:
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))
... 
класс numpy.ctypeslib.c_intp#

A ctypes знаковый целочисленный тип того же размера, что и numpy.intp.

В зависимости от платформы, это может быть псевдоним для c_int, c_long или c_longlong.