C++ 应用程序 (Sci)Python 之间的数据交换

Posted

技术标签:

【中文标题】C++ 应用程序 (Sci)Python 之间的数据交换【英文标题】:Data Exchange between C++ Application (Sci)Python 【发布时间】:2012-03-14 10:00:58 【问题描述】:

我正在开发一个用于科学目的的 c++/Qt 软件。虽然 Eigen 库为我提供了许多分析矩阵的操作,但为所有可能的操作串联设计 gui 仍然很痛苦/困难。因此,我也在运行时与 Matlab 交换矩阵。由于 Matlab 不是开源的,而且我大学的学生很难获得,我想用 python 做同样的事情,所以我可以使用例如用于分析的 SciPy。因此我的问题是:如何与 python 交换数据(例如稀疏矩阵),尤其是运行时的 scipy?

请注意,我可能会认为这是错误/复杂的方式,因此我愿意接受其他解决方案来解决我的问题。我尝试使用 PythonQt 最终在 python 中运行我的整个应用程序,但它还不能与 Qt4.8 一起使用,而且要让其他部分可由 python 调用仍然意味着很多工作。我们现在使用的是 QScript,正如预期的那样,它不提供任何数据分析工具。

【问题讨论】:

你能举一两个“交换矩阵”的例子吗?说 cA cB ... 是 C 端的矩阵(什么格式?), sC sD ... 在 scipy 端,你想要 cA cB -> some scipy func -> sD -> 回到 cD ? @Denis 没错。我的 c++ 代码会生成一些矩阵,例如std::vector,特征密集和稀疏矩阵,我想在 SciPi 中分析,例如计算条件数,并将一些结果发送回 c++。 也许这取决于您实际使用的 Eigen 库的哪些部分,但是在整个项目中使用 Sage (sagemath.org) 怎么样? @Masci 看起来像一个有趣的包。然而,我在我的软件中大量使用了半边数据结构和高级 opengl,乍一看,这似乎不是 Sage 的用途。 【参考方案1】:

不是一个答案,而是几个更博学的地方要问:

1) 询问cython mailing list (你知道cython吗? 将正常的密集 Numpy 数组向下传递给 C 并将它们填充到 C 中很容易; 你可以为你的工作预先分配一个足够大的 Numpy 数组吗?)

2) scikit-learn 加载稀疏数组数据文件 → scipy.sparse 数组。

【讨论】:

感谢您的建议。我会看一看。 (见我上面对 rdchambers 的回复)【参考方案2】:

Cython(它似乎是 Sage 的一个分支)是一种将 Python 和 C/C++ 粘合在一起的流行方式。在我有限的经验中,它非常优雅和有效。

他们有一个很好的tutorial on working with Numpy arrays(几乎可以肯定你应该如何在 Python 中表示数组)。当然,Numpy/Scipy 提供了许多与 Matlab 相同的数字。

【讨论】:

感谢您的建议。乍一看,这似乎是一种从 python 调用我的 c++ 代码的方法,而我更喜欢在运行时将 python 控制台与我的 c++ 应用程序连接起来。不过,我会更深入地研究 Cython,看看是否能找到解决方案。 "用我的 c++ 连接 python 控制台":为什么不使用管道,请参阅 subprocess.Popen 和 numpy fromfile / tofile ?或者问一个新问题,例如“python C over 管道”。

以上是关于C++ 应用程序 (Sci)Python 之间的数据交换的主要内容,如果未能解决你的问题,请参考以下文章

python编写一个程序求出1到100之间所有末位数的乘积小于数本身的所有的数

python编写一个程序求出1到100之间所有末位数的乘积小于数本身的所有的数

python: 输出 1~100 之间不能被 7 整除的数,每行输出 10 个数字,要求应用字符串格式化方法美化输出格式。

静态单链表 C++版本 Python版本

python请求上的sci-hub响应403错误?

python和c++程序之间不寻常的速度差异