После этот ответ на вопрос "Могу ли я заставить numpy ndarray взять на себя ответственность за свою память?" Я попытался использовать функцию API Python C PyArray_ENABLEFLAGS
через Cython Обертка NumPy и обнаружила, что она не отображается.
Следующая попытка разоблачить его вручную (это всего лишь минимальный пример, воспроизводящий сбой)
from libc.stdlib cimport malloc
import numpy as np
cimport numpy as np
np.import_array()
ctypedef np.int32_t DTYPE_t
cdef extern from "numpy/ndarraytypes.h":
void PyArray_ENABLEFLAGS(np.PyArrayObject *arr, int flags)
def test():
cdef int N = 1000
cdef DTYPE_t *data = <DTYPE_t *>malloc(N * sizeof(DTYPE_t))
cdef np.ndarray[DTYPE_t, ndim=1] arr = np.PyArray_SimpleNewFromData(1, &N, np.NPY_INT32, data)
PyArray_ENABLEFLAGS(arr, np.NPY_ARRAY_OWNDATA)
сбой компиляции:
Error compiling Cython file:
------------------------------------------------------------
...
def test():
cdef int N = 1000
cdef DTYPE_t *data = <DTYPE_t *>malloc(N * sizeof(DTYPE_t))
cdef np.ndarray[DTYPE_t, ndim=1] arr = np.PyArray_SimpleNewFromData(1, &N, np.NPY_INT32, data)
PyArray_ENABLEFLAGS(arr, np.NPY_ARRAY_OWNDATA)
^
------------------------------------------------------------
/tmp/test.pyx:19:27: Cannot convert Python object to 'PyArrayObject *'
Мой вопрос: Правильно ли это подходит в этом случае? Если да, то что я делаю неправильно? Если нет, как заставить NumPy взять собственность в Cython, не дойдя до модуля расширения C?