2012-01-10 54 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 

注:未經測試