将 array/vector 发送到 C++ 脚本的 Cython 示例

Cython example for sending array/vector to a c++ script

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

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

基本上,在 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,我很困惑。

示例提到 (int* a, int n) 作为上述函数的参数,但我不明白 a 和 n 是什么意思以及我如何将数组索引到C++ 方面。最后写pyx镜像我也不清楚

如果有人能为此类 c++ 函数及其对应的 pyx 函数提供一个非常简单的片段示例,我将不胜感激。也非常欢迎除 memoryviews 之外的任何不慢的建议:)

  • a 是一个包含指向零个或多个 int.
  • 的指针的变量
  • na 包含的值的数量。

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

C++ header 看起来像:

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 文件,而不是 header)。