相关疑难解决方法(0)

Cython - 将指向数组的指针转换为Python对象

好吧,我非常接近完成这个我可以品尝它.在过去几周左右的时间里,我一直在尝试创建一个Python扩展,以便通过Cython与用C++编写的库进行交互.在这里和一些朋友的帮助下,我已经设法获得了98%的感觉.唯一剩下的就是这个:我不能为我的生活找出如何将指向无符号短裤数组的指针变成python对象(最好是列表).

一点背景,我试图与设置回调函数的库的一部分接口,我已经成功完成了这个:

global callbackfunc

ctypedef unsigned short const_ushort "const uint16_t"

ctypedef void (*Function1)(const_ushort *data, unsigned width, unsigned height)

cdef extern from "lib.hpp":
    void SetCallback(Function1)

cdef void cSetCallback(Function1 function):
    SetCallback(function)

cdef void callcallback(const_ushort *data, unsigned width, unsigned height):
    global callbackfunc
    callbackfunc(data,width,height)

cSetCallback(callcallback)

def PySetCallback(callbackFunc):
    global callbackfunc
    callbackfunc = callbackFunc
Run Code Online (Sandbox Code Playgroud)

问题出现在函数"callcallback"中,我得到错误:"无法将'const_ushort*'转换为Python对象".我第一次尝试这个是创建一个新的python列表,并循环以将数组的每个元素放入python列表,如下所示:

datalist = []
for i in range(width*height):
    datalist += data[i]
Run Code Online (Sandbox Code Playgroud)

遗憾的是,在编译的cython代码中,我试图将类型定义为"const const unsigned short",这显然是一个问题.

然后我尝试了这个:

datalist = []
for i in data:
    datalist += i
Run Code Online (Sandbox Code Playgroud)

这让我"C数组迭代需要已知的结束索引".请注意,我对C/C++知之甚少,所以大部分内容对我来说都没有多大意义.

所以,无论如何,是否有任何有效的方法将这样的指针转换为python对象(最好比循环遍历数组更快,因为它通常约为57344项,这对时间非常敏感)

编辑:稍微澄清一下,正如我所提到的,我正在使用回调,并且调用它的库中的C++函数会发送一个指向"const uint_16"数组的指针,这就是我用这种方式定义const_ushort的原因,因为否则类型不统一.我无法以任何方式修改库.

Edit2 …

python cython

10
推荐指数
1
解决办法
4047
查看次数

泡菜cython类

我必须保存并加载一个cython类实例.我的cython类是以及几种方法:

import numpy as np
cimport numpy as np
cimport cython    
cdef class Perceptron_avg_my:
    cdef int wlen,freePos
    cdef np.ndarray w,wtot,wac,wtotc #np.ndarray[np.int32_t]
    cdef np.ndarray wmean  #np.ndarray[np.float32_t]    
    cdef public dict fpos    

    def __cinit__(self,np.int64_t wlen=4*10**7):
        self.fpos= dict()
        self.freePos=1
        self.wlen=wlen
        self.w=np.zeros(wlen,np.int32)
        self.wtot=np.zeros(wlen,np.int32)
        self.wac=np.zeros(wlen,np.int32)
        self.wtotc=np.zeros(wlen,np.int32)
        self.wmean=np.zeros(wlen,np.float32)

    cpdef evaluate_noavg(self,list f):
        cdef np.ndarray[np.int32_t] w = self.w
        cdef dict fpos = self.fpos        
        cdef bytes ff
        cdef int i
        cdef long int score=0

        for ff in f:
            i=fpos.get(ff,0)  
            if i != 0: 
                score += w[i]
        return score
Run Code Online (Sandbox Code Playgroud)

我在考虑使用cPickle模块.我明白我必须实现一个__reduce __(自我)方法但是我有一些问题需要找到一个例子并且很好地理解文档 …

python reduce class pickle cython

9
推荐指数
2
解决办法
7396
查看次数

通过 pickle 保存 cython 扩展

我有一个类或扩展类型,cython如下所示:

cdef class Self_Organized_Map:
     cdef 
     def __cinit__(self,np.ndarray data,.....):
     ....
Run Code Online (Sandbox Code Playgroud)

我使用此cython文件(其名称为som.pyx)创建了一个 python 模块distutils,然后将其导入python并用它来创建和训练模型,但是当我想使用它保存模型时,pickle它给了我这个错误:

TypeError:无法腌制 som.Self_Organized_Map 对象

pickle 或我的代码有什么问题?pickle 无法保存扩展对象吗?

python pickle cython python-3.x cythonize

4
推荐指数
1
解决办法
1298
查看次数

标签 统计

cython ×3

python ×3

pickle ×2

class ×1

cythonize ×1

python-3.x ×1

reduce ×1