【问题标题】:Extend and Embed Python (and NumPy) with C++ (and GSL): pass gsl_matrix to python and back使用 C++(和 GSL)扩展和嵌入 Python(和 NumPy):将 gsl_matrix 传递给 python 并返回
【发布时间】:2013-09-11 18:40:01
【问题描述】:

我的问题“应该”很简单,但我仍然无法解决。

我目前正在从事一个需要大量计算(用 C++ 完成)和一些后期模拟数据分析(用 Python 完成)的项目。

但是,现在我正在更改主要算法,我需要在 C++ 和 Python 中来回“循环”一些计算。 也就是说,我需要在 C++ 和 Python 中来回移动一个双精度矩阵。

在 C++ 中,数据矩阵是“gsl_matrix”对象,而在 python 中,相同的矩阵被实现为“numpy 数组”。

目前,我正在运行我的 C++ 代码,将矩阵保存到文件,从 python 读取它,将其写回文件,然后在 C++ 中再次打开它以进行进一步计算。

由于这是非常低效的,我想问一下是否有人可以给我一个关于如何以“干净”方式做到这一点的例子。

我一直在阅读(并尝试了 10 天)SWIG、Cython、Boost.Python 和 Boost.Numpy,但我仍然无法破解它。

有人可以分享一个有效的例子吗?

谢谢!

雷内

【问题讨论】:

  • 您如何看待事情的发展?使用 PyArray_SimpleNewFromDatagsl_matrix struct 指针转换为 PyArrayObject 指针似乎很简单,但如何处理它周围的一切很大程度上取决于您希望事情发生什么/如何发生。
  • 好吧,我们的想法是让一些东西活起来:“ import numpy as np import MYCPP as mycpp DATA = np.loadtxt(...) # 这里的 DATA 是一个 TxN 矩阵 out = mycpp. run(DATA, params) # 这里的 out 将是一个 Nx1 向量 " 在 C++ 中,DATA 需要是一个 gsl_matrix 才能工作,并且从 C++ 代码返回的 "out" 向量将是一个 gsl_vector

标签: c++ python numpy gsl


【解决方案1】:

我认为您不需要自己实现包装器,因为您可以使用pygsl。如果你真的想实现自己的版本,这里是 pygsl 的例程,可能对你有价值

%{
#include <gsl/gsl_matrix_double.h>
#include <gsl/gsl_matrix_complex_double.h>
%}

%include typemaps.i

// gsl_matrix typemaps
%typemap(in) gsl_matrix* %{
  PyArrayObject *_PyMatrix$argnum;
  gsl_matrix_view matrix$argnum;
  {
    _PyMatrix$argnum = (PyArrayObject*)
      PyArray_ContiguousFromObject($input, PyArray_DOUBLE, 2, 2);
    if (_PyMatrix$argnum == NULL)
      return NULL;
    matrix$argnum
      = gsl_matrix_view_array((double*)_PyMatrix$argnum->data,
                  _PyMatrix$argnum->dimensions[0],
                  _PyMatrix$argnum->dimensions[1]);    
    $1 = &matrix$argnum.matrix;
  }
%}

【讨论】:

  • 我仍然不确定如何使用它。无论如何,我不认为 pygsl 是一个解决方案。我不需要调用 gsl 函数,我需要能够从 python 将 gsl_matrix 传递给我的 C++ 程序。 IE。我需要将我的 C++ 程序“视为”一个 python 模块来发送和返回 gsl_matrices。
  • 我放了这个 pygsl 实现代码,因为它似乎是 pygsl 将 python 数组发送到 GSL ("(double*)_PyMatrix$argnum->data") 的方式。因此,似乎转换为 C/c++ gsl_matrix 必须与此有些相似。
  • 我仍然不知道该怎么办。
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多