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

Best choice for passing float arrays in Cython

假设有一个 C++ class,我们想在其中定义一个要在 python 中调用的函数。在 python 方面,目标是能够通过以下方式调用此函数:

输入:2D类型numpy-array(float32),或list of lists,或其他建议

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

如果有帮助,latency/simplicity 一维数组也可以。

例如,可以在 header 中定义一个函数:

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

输入为字符串类型,输出为布尔类型。

有什么可以很好的选择符合上面的要求写在header?

最后,在 header 文件之后,Cython 的 pyx/pyd 文件应该写什么?

Cython 输入

用于 Python 和 Cython 之间输入接口的最自然的 Cython 类型是 2D typed memoryview。这将采用 2D numpy 数组,以及任何其他导出缓冲区接口的 2D 数组类型(没有太多其他类型,因为 Numpy 非常普遍,但一些图像处理库有一些替代方案)。

我会避免使用列表列表作为接口 - 第二维的长度定义不明确。但是,Numpy 数组很容易从列表列表中创建。

Cython 输出

对于输出,您 return Cython 内存视图或 Numpy 数组(使用 np.asarray(memview) 从内存视图轻松创建)。我可能 return 一个 Numpy 数组,但是根据你是否想让 Numpy 成为一个硬依赖来做出决定。

C++ 接口

如果不了解您的代码,很难回答这个问题。如果您有现有代码,您应该尽可能使用最自然的类型。

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

类似的注意事项适用于输出数据,但如果不知道您在 C++ 中尝试做什么,就很难知道。