2012-01-10 2 views
5

Каков наилучший способ вызова этой функции в cython только с numpy? Я не собираюсь использовать ctypes, тетсру, таНос и т.д ..Как я могу назвать эту функцию в 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, Choi

+0

Там нет необходимости вызывать эти функции из питона. Вы можете просто сделать то же самое, используя numpy – nosklo

+0

, потому что мне нужно сделать это, мне нужно обернуть некоторую существующую библиотеку c, C++ .. так что просто создание функции numpy не будет решением. поэтому я написал простой пример, например, выше. – wonjun

+1

опубликуйте настоящие функции, отправляйте свою попытку кода и ошибки, которые вы получаете – nosklo

ответ

0

Вы не можете call эта функция от 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

+0

Вы отметите это как вопрос, как ответили? ;-) – danodonovan

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 

Примечание: Непроверенные

Смежные вопросы