【问题标题】:Wrap a double** c++ function with cython用 cython 包装一个 double** c++ 函数
【发布时间】:2018-05-30 17:22:02
【问题描述】:

我有一个 C++ 函数,它返回一个指针 double** - 特别是一个高维矩阵 - 我想使用 Cython 将它包装到一些 python 代码中。我该怎么做?

为了简单起见,这里有一个带有 double* 指针的函数示例。

我的 C++ fib.cpp 代码:

double add(double a, double b)
{
 return a+b;
}

double p[]= {1,2,3,4}; 

double* mult(double a)    
{
p[0]=p[0]*a;
p[1]=p[1]*a;
return p; 
}

然后是fib.hpp文件:

double add(double a,double b);
double* mult(double a);

然后是pxd文件fib.pxd:

cdef extern from "fib.hpp":
     double add(double a,double b);
     double* mult(double a);

最后是pyx文件

# distutils: language = c++
# distutils: sources = fib.cpp 

cimport fib 

def add(a,b):
    return fib.add(a,b)
def mult(a):           # dropping these lines
    return fib.mult(a) # the code works without the double* function

一切都是用相当标准的setup.py编译的:

from distutils.core import setup, Extension
from Cython.Build import cythonize

ext = Extension("fib2cpp",
            sources=["fib.pyx", "fib.cpp"],
            language="c++")

setup(name="fib",
ext_modules=cythonize(ext))

当我编译代码时:

setup.py build_ext -if

无法将“double *”转换为 python 对象。

当我尝试使用 double** 函数时,我得到了同样的错误。 我该怎么办?

【问题讨论】:

    标签: python c++ pointers


    【解决方案1】:

    我已经找到了double * 案例的解决方案。首先,文件fib.pxd 没用。 然后我们需要一个新的fib.pyx 文件:

    # distutils: language = c++
    # distutils: sources = fib.cpp
    
    
    import numpy as np 
    cimport numpy as cnp 
    
    
    
    cdef extern from "fib.hpp":
         double fib(int n)
         double add (double a, double b)
         double* mult(double a)
    
    
    
    def make_mult(double a):
        cdef double[:] mv = <double[:4]> mult(a) # the 4 stands for
        return np.asarray(mv)   # the dimension of the array defined in fib.cpp 
    

    对于返回 nrows*ncols 矩阵的函数;比如double* make_mat(int nrows, int ncols),函数make_mult的第二行要改写为:

    cdef double[:,:] mv=<double[:nrows,:ncols]> make_mat(nrows, ncols) 
    

    很遗憾,如果我有一个函数double** make_mat(int nrows, int ncols) 总是返回一个矩阵,那么前面的代码就会出现错误:

    指针基类型与 cython.array 基类型不匹配

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2015-06-17
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多