假设有一个C++类,我们想在其中定义一个在python中调用的函数。在python中,我们的目标是能够调用这个函数。
输入类型:2D numpy-array(float32),或列表,或其他建议。
产量类型:2D numpy-array(float32),或列表,或其他建议。
如果对延迟简单化有帮助,1D数组也可以。
例如,我们可以在头中定义一个函数,其输入为字符串类型,输出为bool。
bool func(const std::string& name);
输入为string类型,输出为bool。
有了上述要求,在头文件中写什么可以是一个好的选择呢?
最后,在头文件之后,Cython的pyxpyd文件中应该写什么?
在Python和Cython之间的输入接口,最自然的Cython类型应该是一个二维的 类型化内存视图. 这将接受一个 2D numpy 数组,以及任何其他导出缓冲区接口的 2D 数组类型(由于 Numpy 非常普遍,所以没有太多其他类型,但一些图像处理库有一些替代方案)。
我会避免使用list-of-list作为接口--第二个维度的长度不好定义。然而,Numpy数组很容易从list-of-list中创建。
对于输出,你可以返回一个Cython内存视图,或者一个Numpy数组(很容易从内存视图中用 np.asarray(memview)
). 我可能会返回一个Numpy数组,但要根据你是否想让Numpy成为一个硬依赖来决定。
在不了解你的代码的情况下,这很难回答。如果你有现有的代码,你应该尽可能使用最自然的类型。
你可以用以下方法从内存视图中获取一个指针 &memview[0,0]
,并访问其属性 .shape
和 .strides
来获取数据如何存储的信息。(如果你使内存view连续,那么你从形状上就可以知道步长,所以更简单)。然后你需要决定是复制数据,还是直接使用指向Python拥有的数据的指针(如果C++只在函数调用期间保留数据,那么使用指针是好的)。
类似的考虑因素也适用于输出数据,但在不了解你在C++中要做什么的情况下,很难知道。