将数组从c传输到python

将数组从c传输到python,第1张

概述我正在将一个双数组从c函数传递给 python函数.我的代码是: C代码: double *compute(int size, const double a[]){ double* array; array = malloc(sizeof(double)*size); for (int i=0; i<size; i++) { array[i] = 3*a[ 我正在将一个双数组从c函数传递给 python函数.我的代码是:
C代码:

double *compute(int size,const double a[]){    double* array;    array = malloc(sizeof(double)*size);    for (int i=0; i<size; i++)    {    array[i] = 3*a[i];    }    //printf("Array in compute-function is: \n[");    //for(int i = 0; i < size; i++)        //printf("%f,",array[i]);    //printf("]\n");    return array;}

PYX代码:

cdef class ArrayWrapper:    cdef voID* data_ptr    cdef int size    cdef set_data(self,int size,voID* data_ptr):        """ Set the data of the array        This cannot be done in the constructor as it must recIEve C-level        arguments.        Parameters:        -----------        size: int            Length of the array.        data_ptr: voID*            Pointer to the data                    """        self.data_ptr = data_ptr        self.size = size    def __array__(self):        """ Here we use the __array__ method,that is called when numpy            trIEs to get an array from the object."""        cdef np.npy_intp shape[1]        shape[0] = <np.npy_intp> self.size        # Create a 1D array,of length 'size'        ndarray = np.PyArray_SimpleNewFromData(1,shape,np.NPY_INT,self.data_ptr)        return ndarray    def __dealloc__(self):        """ Frees the array. This is called by Python when all the        references to the object are gone. """        free(<voID*>self.data_ptr)def py_compute(int size,np.ndarray[np.double_t,ndim=1] a):    """ Python binding of the 'compute' function in 'GNLSE_RHS.c' that does        not copy the data allocated in C.    """    cdef double *array    cdef np.ndarray ndarray    # Call the C function    array = compute(size,<double*> a.data)    array_wrapper = ArrayWrapper()    array_wrapper.set_data(size,<voID*> array)     ndarray = np.array(array_wrapper,copy=False)    # Assign our object to the 'base' of the ndarray object    ndarray.base = <PyObject*> array_wrapper    # Increment the reference count,as the above assignement was done in    # C,and Python does not kNow that there is this additional reference    Py_INCREF(array_wrapper)    return ndarray

Python代码:

for i in xrange(10):    x[i] = i;a = cython_wrapper.py_compute(10,x)print a

但我的结果是

[         0          0          0 1074266112          0 1075314688          0 1075970048          0 1076363264]

而不是预期的

[  0.   3.   6.   9.  12.  15.  18.  21.  24.  27.]

我的错误在哪里?我认为它与有问题的指针传输有关,但我不确定.

解决方法 这里的错误是在线

ndarray = np.PyArray_SimpleNewFromData(1,self.data_ptr)

你告诉numpy self.data_ptr指向一个int数组而不是一个双精度数.

您可以通过告诉numpy正确的数据类型来修复代码,如下所示:

ndarray = np.PyArray_SimpleNewFromData(1,np.NPY_DOUBLE,self.data_ptr)

它应该按预期工作.

除此之外,您可以稍微简化您的包装器代码,而不必传入输入数组的大小,因为它已经包含在您传递给py_compute的np.ndarray中

def py_compute(np.ndarray[np.double_t,ndim=1] a):    """ Python binding of the 'compute' function in 'GNLSE_RHS.c' that does        not copy the data allocated in C.    """    cdef double *array    cdef np.ndarray ndarray    cdef size = a.shape[0]    # Call the C function    array = compute(size,&a[0])    array_wrapper = ArrayWrapper()    array_wrapper.set_data(size,and Python does not kNow that there is this additional reference    Py_INCREF(array_wrapper)    return ndarray
总结

以上是内存溢出为你收集整理的将数组从c传输到python全部内容,希望文章能够帮你解决将数组从c传输到python所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1227908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存