Python 的 C++ 扩展模块返回一个 Numpy 数组

Posted

技术标签:

【中文标题】Python 的 C++ 扩展模块返回一个 Numpy 数组【英文标题】:C++ extension module for Python returning a Numpy array 【发布时间】:2018-10-26 11:53:29 【问题描述】:

我正在尝试使用 SWIG 在 C++ 中为 Python 创建一个扩展模块,它可以将 Numpy 数组返回给 Python。这个 numpy 数组是多维的,每个单元格都可以有一个值或一个值列表(int 64、[int32、int32] 等)。我能够从 C++ 向 Python 返回一个普通数组。谁能指导我如何继续这个?我遇到了 numpy.i、arrayinterface、typemaps,我不太清楚如何开始。有人可以在这方面指导我吗?谢谢。

【问题讨论】:

我应该从 Numpy C API 开始吗? 【参考方案1】:

我认为 Numpy C API 是一个很好的方法。你仍然可以使用 SWIG。但我强烈建议不要使用 SWIG 类型映射,它们非常复杂。相反,您可以在 SWIG 签名中接受并返回 Numpy 数组作为 PyObject* 指针,并使用 C API 构建/提取它们。 SWIG 将正确包装它。

如果这是您的第一个 Python 扩展,请确保您阅读了Python C API intro。至少,您需要了解引用计数的 API 协定。

另一种选择是实现 numpy 理解的 buffer protocol API。

如果您不喜欢 C 代码进入 C++ 世界,另一个选择是 Boost.Python。我没有这方面的经验。我个人喜欢 Python C API 的低复杂度。

【讨论】:

非常感谢您的回复。我会根据你的建议做一些研究。我开始认为 PyArray_SimpleNewFromData 会帮助我完成它。

以上是关于Python 的 C++ 扩展模块返回一个 Numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?

Python:C++ 扩展返回多个值

如何用C++ 写Python模块扩展

C++开发python windows版本的扩展模块示例

如何暴露一个不能直接暴露的c++函数,同名

扩展Python模块系列----开发环境配置