2012-01-10 55 views
5

在cython中只用numpy调用这个函数的最好方法是什么? 我不打算使用ctypes的,memcpy的,的malloc等。如何在cython中调用此函数?

功能1)

#include <stdio.h> 
extern "C" void cfun(const void * indatav, int rowcount, int colcount, 
void * outdatav); 

void cfun(const void * indatav, int rowcount, int colcount, void * 
outdatav) { 
    //void cfun(const double * indata, int rowcount, int colcount, 
double * outdata) { 
    const double * indata = (double *) indatav; 
    double * outdata = (double *) outdatav; 
    int i; 
    puts("Here we go!"); 
    for (i = 0; i < rowcount * colcount; ++i) { 
     outdata[i] = indata[i] * 4; 
    } 
    puts("Done!"); 
} 

功能2)

#include <stdio.h> 

extern "C" __declspec(dllexport) void cfun(const double ** indata, int 
rowcount, int colcount, double ** outdata) { 
    for (int i = 0; i < rowcount; ++i) { 
     for (int j = 0; j < colcount; ++j) { 
      outdata[i][j] = indata[i][j] * 4; 
     } 
    } 
} 

Wonjun,崔

+0

没有必要调用这些功能,从蟒蛇。你可以使用numpy做同样的事情 – nosklo 2012-01-10 01:21:11

+0

我必须这样做的原因是我需要包装一些现有的c,C++库..所以..只是使numpy函数不会是一个解决方案。这就是为什么我发布上面的简单例子。 – wonjun 2012-01-10 01:28:55

+1

然后发布实际功能,发布你的代码尝试和你得到的错误 – nosklo 2012-01-10 10:30:38

回答

0

你不能电话这个功能来自cython - 你必须它作为一个cython函数 - 一些很好的例子是here。作为参考,功能1):

cimport numpy as np 

def cfun(np.ndarray indata, int rowcount, int colcount, np.ndarray outdata): 
    cdef int i 
    print("Here we go!") 
    for i in range(rowcount * colcount): 
     outdata[i] = indata[i] * 4 
    print("Done!") 

如果你真的想叫这个,你将不得不使用ctypes的或写自己的包装。使用swig也可以。

+0

你会让我为功能2)的例子吗? – wonjun 2012-01-10 21:37:53

+0

你会将此标记为已回答的问题吗? ;-) – danodonovan 2012-01-10 22:16:15

2

您可以直接从Cython'调用'该函数,声明它为extern

cdef extern from "mylibraryheader.h": 
    void cfun1(void* indatav, int rowcount, int colcount, void* outdatav) 
    void cfun2(double** indata, int rowcount, int colcount, doubke** outdata) 

您现在可以像在C/C++中那样调用这些函数。请注意,在Cython中没有const关键字,您可以将其忽略。不幸的是,我不能给你举例说明如何将NumPy数组转换为double的数组。但是这里有一个从双打列表中运行它的例子。

cdef extern from "mylibraryheader.h": 
    void cfun1(void* indatav, int rowcount, int colcount, void* outdatav) 
    void cfun2(double** indata, int rowcount, int colcount, double** outdata) 

cdef extern from "stdlib.h": 
    ctypedef int size_t 
    void* malloc(size_t) 
    void free(void*) 

def py_cfunc1(*values): 
    cdef int i = 0 
    cdef int size = sizeof(double)*len(values) 
    cdef double* indatav = <double*> malloc(size) 
    cdef double* outdatav = <double*> malloc(size) 
    cdef list outvalues = [] 
    for v in values: 
     indatav[i] = <double>v 
     i += 1 
    cfun1(<void*>indatav, 1, len(values), <void*>outdatav) 
    for 0 <= i < len(values): 
     outvalues.append(outdatav[i]) 
    return outvalues 

注:未经测试