2012-01-10 10 views
5

¿Cuál es la mejor manera de llamar a esta función en cython con solo numpy? no voy a utilizar ctypes, establecimiento de memoria, etc .. malloc¿cómo puedo llamar a esta función en cython?

función 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!"); 
} 

función 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

No hay necesidad de llamar a las funciones de pitón. Puedes hacer las mismas cosas usando numpy – nosklo

+0

, la razón por la que tengo que hacer esto es que necesito envolver alguna librería c, C++ existente ... así que ... solo hacer la función numpy no será una solución. es por eso que publiqué un ejemplo simple como el anterior. – wonjun

+1

publique las funciones reales, publique su intento de código y los errores que está obteniendo – nosklo

Respuesta

0

No se puede llamada esta función de cython - usted tiene que escribir como una función de cython - algo bueno los ejemplos son here. A modo de referencia, la función 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!") 

Si realmente quiere llamar a esta tendrá que utilizar ctypes o escribir su propio envoltorio. Usar swig también funcionaría.

+0

¿Me haría un ejemplo para la función 2)? – wonjun

+0

¿marcará esto como una pregunta como respondida? ;-) – danodonovan

2

Puede 'invocar' la función directamente desde Cython declarándola como 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) 

Ahora puede llamar a estas funciones como en C/C++. Tenga en cuenta que no hay const palabra clave en Cython, puede dejar de lado. Desafortunadamente no puedo darle un ejemplo de cómo convertir la matriz NumPy en una matriz de doble. Pero aquí hay un ejemplo de ejecutarlo desde una lista de dobles.

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 

Nota: No comprobado

Cuestiones relacionadas