in как получить адрес памяти массива numpy для C также используется __array_interface__
, возвращаемое целое число - указатель на сегмент данных массива и без адреса памяти:
данные (необязательно)
2-кортеж, первый аргумент которого является целым числом (длинное целое число)при необходимости) указывает на область данных, в которой хранится содержимое массива.Этот указатель должен указывать на первый элемент данных (другими словами, в этом случае любое смещение всегда игнорируется) .Вторая запись в кортеже - это флаг только для чтения (true означает, что область данных доступна только для чтения).
Этот атрибут также может быть объектом, представляющим интерфейс буфера, который будет использоваться для обмена данными.Если этот ключ отсутствует (или возвращает None), то совместное использование памяти будет осуществляться через интерфейс буфера самого объекта.В этом случае клавиша смещения может использоваться для указания начала буфера.Ссылка на объект, представляющий интерфейс массива, должна быть сохранена новым объектом, если необходимо защитить область памяти.
По умолчанию: Нет
source: https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html
вы можете видеть содержимое всего словаря, возвращаемого __array_interface__
с print x.__array_interface__[]
__array_struct__
содержит отчетливый указатель C на первый элемент массива, доступ к которому можно получить изнутриваш код на C (++), пример: http://blog.audio -tk.com / 2008/11/04 / выставление-интерфейс-массива-с-swig-for-a-cc-структурой / :
`
C-struct access
Этот подход к интерфейсу массива обеспечивает более быстрый доступ к массиву с использованием только одногопоиск атрибутов и четко определенная C-структура.
__array_struct__
A: c: type: PyCObject, член voidptr которого содержит указатель на заполненную структуру PyArrayInterface.Память для структуры создается динамически, и PyCObject также создается с соответствующим деструктором, поэтому средство извлечения этого атрибута просто должно применить Py_DECREF к объекту, возвращенному этим атрибутом, когда он будет завершен.Кроме того, либо данные должны быть скопированы, либо должна быть сохранена ссылка на объект, представляющий этот атрибут, чтобы гарантировать, что данные не освобождаются.Объекты, представляющие интерфейс __array_struct__
, также не должны перераспределять свою память, если другие объекты ссылаются на них.
Структура PyArrayInterface определена в numpy/ndarrayobject.h
как:
typedef struct {
int two; /* contains the integer 2 -- simple sanity check */
int nd; /* number of dimensions */
char typekind; /* kind in array --- character code of typestr */
int itemsize; /* size of each element */
int flags; /* flags indicating how the data should be interpreted */
/* must set ARR_HAS_DESCR bit to validate descr */
Py_intptr_t *shape; /* A length-nd array of shape information */
Py_intptr_t *strides; /* A length-nd array of stride information */
void *data; --------> /* A pointer to the first element of the array */ < ------
PyObject *descr; /* NULL or data-description (same as descr key
of __array_interface__) -- must set ARR_HAS_DESCR
flag or this will be ignored. */
} PyArrayInterface;
source: https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html