python - 是否可以通过引用将 numpy 数组传递给 cpdef 函数?
问题描述
是否可以编写一个Cython函数,其中一个numpy 数组通过引用传递(可能是内存视图?),我可以在Python中使用这样的函数吗?
我试过:
cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2]& sums):
...
...
在这里counter
,sums
将通过引用传递。我对后者感兴趣(但很乐意接受关于两者的批评和建议)。
编译器抛出:
Reference base type cannot be a Python object
我得到了相同的信息,cdef
但我不了解问题的完整病因。
解决方案
是的 - 有点。
Numpy 数组是一个 Python 对象。无论如何,所有 Python 对象都是“通过引用”传递的(即,如果您在函数内部更改 Numpy 数组的内容,则在外部更改它)。
因此,您只需这样做
cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2] sums):
将其指定为 C++ 引用并没有多大意义。对于 Python 对象,Cython 隐藏了很多细节。
但是,cpdef
函数设计为可从 Python 和 Cython 调用。Python 整数(和其他数字类型)是不可变的。因此,从 Python 调用时,更改counter
不会像您想象的那样起作用,并且如果它做了您希望的那样,它可能会破坏解释器。
因此,我会避免在cpdef
函数中使用引用(并且可能大部分cpdef
情况下完全避免使用函数 - 通常最好只决定def
or cdef
)
推荐阅读
- android - 在 React Native 中设置第一个项目
- python - python中的跟踪函数
- node.js - 如何使用excel4node在excel表格中写入数组
- python - 合并 pandas df 时出错。TypeError:(“'float'类型的对象没有len()”,'发生在索引D')
- javascript - 无法获取元素的属性
- xcode - 将 Xcode 项目 (Xcode 9) 添加到 Subversion (SVN)
- nativescript-vue - NativeScript-Vue - 从外部组件导航
- firebase - 不能有多个默认规则
- python - 熊猫数据框:根据另一列中的值替换多行
- matlab - 如何在 Matlab / Origin 上绘制不均匀间隔的数据?