python numpy cython memoryview

python - Advertencia de Numeración de Cython sobre NPY_NO_DEPRECATED_API cuando se usa MemoryView



numpy (3)

Estoy convirtiendo una vista de memoria Cython en una matriz numpy (para poder usarla en código Python puro):

from libc.stdlib cimport realloc cimport numpy as np DTYPE = np.float64 ctypedef np.float64_t DTYPE_t cpdef np.ndarray[DTYPE_t] compute(DTYPE_t[:,::1] data): cdef unsigned int Nchannels = data.shape[0] cdef unsigned int Ndata = data.shape[1] cdef DTYPE_t* output = NULL cdef DTYPE_t[::1] mv output = <DTYPE_t*>realloc(output, Ndata*sizeof(output)) if not output: raise MemoryError() mv = <DTYPE_t[:Ndata]>output mv[10:Ndata-10] = 0.0 # various calculations... return np.asarray(mv, dtype=DTYPE, order=''C'')

Compila, pero el compilador da la siguiente advertencia:

/Users/vlad/anaconda/lib/python2.7/site-packages/numpy/core/include /nump/npy_1_7_deprecated_api.h:15:2: warning: "Using deprecated NumPy API, disable it by #defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]

Agregué la directiva sugerida en setup.py:

from distutils.core import setup, Extension from Cython.Build import cythonize import numpy filename = ''agents3.pyx'' agents_module = Extension( ''Agents'', sources = [filename], define_macros = [(''NPY_NO_DEPRECATED_API'', ''NPY_1_7_API_VERSION'')], include_dirs = [numpy.get_include()], ) setup (name = ''Agents'', ext_modules = cythonize(agents_module) )

Ahora no compilaría, dice:

Vlads-MacBook-Pro:program vlad$ python setup.py build_ext --inplace Compiling agents3.pyx because it changed. Cythonizing agents3.pyx running build_ext building ''Agents'' extension gcc -fno-strict-aliasing -I/Users/vlad/anaconda/include -arch x86_64 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -I/Users/vlad/anaconda/lib/python2.7/site-packages/numpy/core/include -I/Users/vlad/anaconda/include/python2.7 -c agents3.c -o build/temp.macosx-10.5-x86_64-2.7/agents3.o agents3.c:2273:52: error: use of undeclared identifier ''NPY_C_CONTIGUOUS'' __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); ^ agents3.c:2311:52: error: use of undeclared identifier ''NPY_F_CONTIGUOUS'' __pyx_t_1 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); ^ agents3.c:2474:42: error: no member named ''descr'' in ''struct tagPyArrayObject'' __pyx_t_4 = ((PyObject *)__pyx_v_self->descr); ~~~~~~~~~~~~ ^ agents3.c:4026:27: error: no member named ''base'' in ''struct tagPyArrayObject'' Py_XDECREF(__pyx_v_arr->base); ~~~~~~~~~~~ ^ /Users/vlad/anaconda/include/python2.7/object.h:823:34: note: expanded from macro ''Py_XDECREF'' #define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) ^ agents3.c:4026:27: error: no member named ''base'' in ''struct tagPyArrayObject'' Py_XDECREF(__pyx_v_arr->base); ~~~~~~~~~~~ ^ /Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro ''Py_XDECREF'' #define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) ^ /Users/vlad/anaconda/include/python2.7/object.h:772:24: note: expanded from macro ''Py_DECREF'' --((PyObject*)(op))->ob_refcnt != 0) / ^ agents3.c:4026:27: error: no member named ''base'' in ''struct tagPyArrayObject'' Py_XDECREF(__pyx_v_arr->base); ~~~~~~~~~~~ ^ /Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro ''Py_XDECREF'' #define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) ^ /Users/vlad/anaconda/include/python2.7/object.h:775:34: note: expanded from macro ''Py_DECREF'' _Py_Dealloc((PyObject *)(op)); / ^ /Users/vlad/anaconda/include/python2.7/object.h:762:15: note: expanded from macro ''_Py_Dealloc'' (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) ^ /Users/vlad/anaconda/include/python2.7/object.h:115:47: note: expanded from macro ''Py_TYPE'' #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) ^ agents3.c:4026:27: error: no member named ''base'' in ''struct tagPyArrayObject'' Py_XDECREF(__pyx_v_arr->base); ~~~~~~~~~~~ ^ /Users/vlad/anaconda/include/python2.7/object.h:823:64: note: expanded from macro ''Py_XDECREF'' #define Py_XDECREF(op) do { if ((op) == NULL) ; else Py_DECREF(op); } while (0) ^ /Users/vlad/anaconda/include/python2.7/object.h:775:34: note: expanded from macro ''Py_DECREF'' _Py_Dealloc((PyObject *)(op)); / ^ /Users/vlad/anaconda/include/python2.7/object.h:762:45: note: expanded from macro ''_Py_Dealloc'' (*Py_TYPE(op)->tp_dealloc)((PyObject *)(op))) ^ agents3.c:4035:16: error: no member named ''base'' in ''struct tagPyArrayObject'' __pyx_v_arr->base = __pyx_v_baseptr; ~~~~~~~~~~~ ^ agents3.c:4070:30: error: no member named ''base'' in ''struct tagPyArrayObject'' __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); ~~~~~~~~~~~ ^ agents3.c:4093:44: error: no member named ''base'' in ''struct tagPyArrayObject'' __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); ~~~~~~~~~~~ ^ agents3.c:1065:37: note: expanded from macro ''__Pyx_INCREF'' #define __Pyx_INCREF(r) Py_INCREF(r) ^ /Users/vlad/anaconda/include/python2.7/object.h:767:18: note: expanded from macro ''Py_INCREF'' ((PyObject*)(op))->ob_refcnt++) ^ agents3.c:4094:41: error: no member named ''base'' in ''struct tagPyArrayObject'' __pyx_r = ((PyObject *)__pyx_v_arr->base); ~~~~~~~~~~~ ^ 11 errors generated. error: command ''gcc'' failed with exit status 1 Vlads-MacBook-Pro:program vlad$

¿Que debería hacer? ¿Está bien dejar la llamada API obsoleta como está? Intenta acceder al campo base , pero no lo hago, es culpa de Cython. Simplemente convertí una vista de memoria a una matriz numpy. ¿Hay alguna otra manera más limpia / segura de hacerlo?


También recibo las mismas advertencias, y yo diría que es normal.

Con la molesta API C necesitas poner una línea delante del script C si no te gusta esta advertencia, pero todo lo que hace es decirle al compilador que ignore el mensaje "obsoleto", parece funcionar de la misma manera. .

Supongo que el compilador de Cython no pone esta línea de código cuando genera el código C, y no creo que eso sea importante.


Solo para una referencia adicional, los documentos en línea de Cython dicen que esto se debe a que Cython usa una API Numpy en desuso, y por el momento, es solo una advertencia que podemos ignorar.


Suponiendo que se desea ocultar la advertencia de desaprobación, se puede implementar la siguiente bandera del compilador con clang: extra_compile_args = [''- Wno- # warnings''].

Para gcc, extra_compile_args = [''- Wno-cpp''] logra lo mismo.

Por supuesto, esto también oculta otras advertencias de directiva de preprocesador.