用于将数组/向量发送到 C++ 脚本的 Cython 示例

Posted

技术标签:

【中文标题】用于将数组/向量发送到 C++ 脚本的 Cython 示例【英文标题】:Cython example for sending array/vector to a c++ script 【发布时间】:2020-06-20 19:54:31 【问题描述】:

假设我们有一个一维 numpy 数组或列表,我们将其用作函数的输入,即 func(np.array[1.5, 2.5, 3.5]),其中该函数来自一个包装的 c++ 类和我们的目标是在 c++ 脚本中打印此数组或向量的值。

但是,我不知道如何为这件事定义c++函数并在pyx文件中指定。并想问您是否可以共享一个像具有上述功能一样简单的 sn-p,其中 低延迟 是最重要的。

基本上,在 c++ 方面我想做:

void func (/* where I don't what to write */) 

std::cout <<  array_[0] << std::endl; // which prints 1.5 (since np.array[1.5, 2.5, 3.5][0] was 1.5)
std::cout <<  array_[1] << std::endl; // which prints 2.5 (since np.array[1.5, 2.5, 3.5][1] was 2.5)
std::cout <<  array_[2] << std::endl; // which prints 3.5 (since np.array[1.5, 2.5, 3.5][2] was 3.5)

似乎 memoryviews 提供了一种可能的解决方案,它也具有低延迟,但是看着 Cython 的 documentation about memoryviews,我很困惑。

示例from here 提到 (int* a, int n) 作为上述函数的参数,但我不明白 a 和 n 的含义以及如何在 c++ 端索引数组。最后写pyx镜像我也不清楚。

如果有人能为这样的 c++ 函数提供一个非常简单的 sn-p 示例并且它是 pyx 对应物,我将不胜感激。除了 memoryviews 之外的任何不慢的建议也非常受欢迎:)

【问题讨论】:

【参考方案1】: a 是一个变量,其中包含一个指向零个或多个 int 的指针。 na 包含的值的数量。

您可以使用标准 C++ 数组访问语法 a[i] 索引 a。确保i &lt; n

C++ 标头将如下所示:

void func(int *a, int n);

.pyx 文件类似于

cdef extern from "myheader.hpp":
    void func(int *a, int n)

def func_wrapper(int[::1] mview):
    func(&mview[0], mview.shape[0])

您需要编译它in the usual way 确保在源列表中列出您的 Cython 源文件和 C 源文件(.cpp 文件,而不是头文件)。

【讨论】:

谢谢。因为我想在 c++ 端访问的数组有浮点数,所以我将其更改为 (float *a, int n) 和 (float[::1] mview),这很有效。我希望这样做没问题。 是的 - 这是处理浮点数而不是整数的正确方法

以上是关于用于将数组/向量发送到 C++ 脚本的 Cython 示例的主要内容,如果未能解决你的问题,请参考以下文章

将 C/C++ 向量快速转换为 Numpy 数组

从 CSV 文件生成 C++ 头文件的 python 脚本(用于数组声明)

C++ RGB 图像数据叠加成二维数组(向量的向量)

C++ 向量到 Python 3.3

将字节数组从 c++ 传递到 c#(单声道)

将 C# 数组传递给 C++ 向量