Cython中传递浮点数组的最佳选择

问题描述 投票:0回答:1

假设有一个C++类,我们想在其中定义一个在python中调用的函数。在python中,我们的目标是能够调用这个函数。

输入类型:2D numpy-array(float32),或列表,或其他建议。

产量类型:2D numpy-array(float32),或列表,或其他建议。

如果对延迟简单化有帮助,1D数组也可以。

例如,我们可以在头中定义一个函数,其输入为字符串类型,输出为bool。

bool func(const std::string& name);

输入为string类型,输出为bool。

有了上述要求,在头文件中写什么可以是一个好的选择呢?

最后,在头文件之后,Cython的pyxpyd文件中应该写什么?

python c++ cython
1个回答
1
投票

Cython 输入

在Python和Cython之间的输入接口,最自然的Cython类型应该是一个二维的 类型化内存视图. 这将接受一个 2D numpy 数组,以及任何其他导出缓冲区接口的 2D 数组类型(由于 Numpy 非常普遍,所以没有太多其他类型,但一些图像处理库有一些替代方案)。

我会避免使用list-of-list作为接口--第二个维度的长度不好定义。然而,Numpy数组很容易从list-of-list中创建。

Cython输出

对于输出,你可以返回一个Cython内存视图,或者一个Numpy数组(很容易从内存视图中用 np.asarray(memview)). 我可能会返回一个Numpy数组,但要根据你是否想让Numpy成为一个硬依赖来决定。

C++接口

在不了解你的代码的情况下,这很难回答。如果你有现有的代码,你应该尽可能使用最自然的类型。

你可以用以下方法从内存视图中获取一个指针 &memview[0,0],并访问其属性 .shape.strides 来获取数据如何存储的信息。(如果你使内存view连续,那么你从形状上就可以知道步长,所以更简单)。然后你需要决定是复制数据,还是直接使用指向Python拥有的数据的指针(如果C++只在函数调用期间保留数据,那么使用指针是好的)。

类似的考虑因素也适用于输出数据,但在不了解你在C++中要做什么的情况下,很难知道。

© www.soinside.com 2019 - 2024. All rights reserved.