我正在将Cython memoryview转换为numpy数组(以便能够在纯Python代码中使用它):
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')
它可以编译,但是编译器给出以下警告:
/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]
我在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)
)
现在它不会编译,它说:
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$
我该怎么办?可以保留不赞成使用的API调用吗?它尝试访问base
字段-但是我没有这样做,这是Cython的错。我只是将memoryview转换为numpy数组。还有另一种更清洁/更安全的方法吗?
参考方案
只是作为进一步参考,cython online docs表示这是因为Cython使用的Numpy API已弃用,目前,这只是一个警告,我们可以忽略。
单行的'if'/'for'语句是否使用Python样式好? - python我经常在这里看到某人的代码,看起来像是“单线”,这是一条单行语句,以传统的“if”语句或“for”循环的标准方式执行。我在Google周围搜索,无法真正找到可以执行的搜索类型?任何人都可以提出建议并最好举一些例子吗?例如,我可以一行执行此操作吗?example = "example" if "exam" in exam…
为什么使用'=='或'is'比较字符串有时会产生不同的结果? - python我有一个Python程序,其中将两个变量设置为'public'值。在条件表达式中,我有比较var1 is var2失败,但如果将其更改为var1 == var2,它将返回True。现在,如果我打开Python解释器并进行相同的“是”比较,则此操作成功。>>> s1 = 'public' >>…
在返回'Response'(Python)中传递多个参数 - python我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…
Python exchangelib在子文件夹中读取邮件 - python我想从Outlook邮箱的子文件夹中读取邮件。Inbox ├──myfolder 我可以使用account.inbox.all()阅读收件箱,但我想阅读myfolder中的邮件我尝试了此页面folder部分中的内容,但无法正确完成https://pypi.python.org/pypi/exchangelib/ 参考方案 您需要首先掌握Folder的myfo…
如何修复AttributeError:模块'numpy'没有属性'square' - pythonImprove this question 我已经将numpy更新为1.14.0。我使用Windows10。我尝试运行我的代码,但出现此错误: AttributeError:模块“ numpy”没有属性“ square”这是我的进口商品:%matplotlib inline import matplotlib.pyplot as plt import ten…