python - Cython 说缓冲区类型只允许作为函数局部变量,即使对于 ndarray.copy()

标签 python numpy cython

我是 Cython 的新手,遇到了这段代码:

import numpy as np
cimport numpy as np

testarray = np.arange(5)
cdef np.ndarray[np.int_t, ndim=1] testarray1 = testarray.copy()
cdef np.ndarray[np.float_t, ndim=1] testarray2 = testarray.astype(np.float)

在编译期间,它说 Buffer types only allowed as function local variables。但是,我使用的是 .copy().astype(),它返回的不是内存 View ,而是副本。为什么这仍然发生?我该如何解决这个问题?

谢谢!

最佳答案

当您使用 np.ndarray[Type, dim] 在 cython 中定义数组时,即访问 python 缓冲区接口(interface),并且这些不能设置为模块级变量。这是一个独立于 View 与 numpy 数组数据副本的问题。

通常,如果我想将数组作为模块级变量(即不是方法的本地变量),我会定义一个 typed memoryview然后使用类似(未测试)的方法在方法中设置它:

import numpy as np
cimport numpy as np

cdef np.int_t[:] testarray1

def init_arrays(np.int_t[:] testarray):
    global testarray1
    testarray1 = testarray.copy()

关于python - Cython 说缓冲区类型只允许作为函数局部变量,即使对于 ndarray.copy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23838241/

相关文章:

python - 即使我在调用 fetchall 之前执行,MySQLdb 也会引发 "execute() first"错误

python - 计算列表项并存储在列表项对应的数据框列中

python - 使用Python的Azure定时器触发函数

python - 是否可以更改 python 中的 ttk.progressBar 浮雕?

python - 最速下降吐出不合理的大值

python - 性能比较Fortran,Numpy,Cython和Numexpr

python - 是什么导致我的矩阵向量乘法的 Cython 实现速度减慢 2 倍?

python - 为大对象分配名称似乎会大大增加内存使用量

image - 将 numpy 图像列表转换为 mp4 视频

python - 如何使用 Cython 将 python 函数作为参数传递给 c++ 函数