用于将数组/向量发送到 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
的指针。
n
是 a
包含的值的数量。
您可以使用标准 C++ 数组访问语法 a[i]
索引 a
。确保i < 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 示例的主要内容,如果未能解决你的问题,请参考以下文章