我想把我的应用程序改写成cython。现在,当我尝试将我的cdef方法作为参数传递给另一个参数时,我遇到了问题。我总是会出错:无法通过编译将“f\u type”转换为Python对象,但下面是我的代码:
你知道吗交叉方法.pxd地址:
cdef class CrossValMethods:
'''
classdocs
'''
cdef list flatCrossVal(self, list items, int numberOfFolds, graph, int nrOfNodes,
defaultClassMat, int lbpSteps, float lbpThreshold, object k_fold_cross_validation,
object separationMethod, object lbp, list layerWeights, isRandomWalk, object adjMatPrep,
object prepareLayers, object prepareClassMat)
你知道吗交叉方法.pyx地址:
cdef class CrossValMethods:
'''
classdocs
'''
def __cinit__(self):
'''
Constructor
'''
cdef list flatCrossVal(self, list items, int numberOfFolds, graph, int nrOfNodes,
defaultClassMat, int lbpSteps, float lbpThreshold, object k_fold_cross_validation,
object separationMethod, object lbp, list layerWeights, isRandomWalk, object adjMatPrep,
object prepareLayers, object prepareClassMat):
...
code
...
这是正常编译
你知道吗LPBTools.pxd文件地址:
cimport graph.method.lbp.CrossValMethods as cvm
ctypedef list (*f_type)(cvm.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class LBPTools:
'''
classdocs
'''
cdef list crossVal(self, items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
k_fold_cross_validation, separationMethod, lbp, layerWeights, f_type crossValMethod, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat)
你知道吗LBPTools.pyx文件地址:
cdef class LBPTools:
def __cinit__(self):
'''
Constructor
'''
cdef list crossVal(self, items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
k_fold_cross_validation, separationMethod, lbp, layerWeights, f_type crossValMethod, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat):
return crossValMethod(cvm.CrossValMethods(), items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold, k_fold_cross_validation, separationMethod, lbp, layerWeights, isRandomWalk, adjMarPrep, prepareLayers, prepareClassMat)
这也成功地编译了,但是
你知道吗扁平磅.pxd地址:
cimport graph.method.lbp.CrossValMethods as cvm
ctypedef list (*f_type)(cvm.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class FlatLBP:
你知道吗扁平件.pyx地址:
ctypedef list (*f_type)(crossValMethods.CrossValMethods, list, int, object, int, object, int, float, object, object, object, list, object, object, object, object)
cdef class FlatLBP:
def __cinit__(self):
'''
Constructor
'''
cdef list start(self, graph, int nrOfNodes, np.ndarray defaultClassMat, int nrOfClasses, int lbpSteps, float lbpThreshold, int numberOfFolds):
cdef list fold_sum = []
cdef int i
for i in range(1,nrOfNodes+1,1):
fold_sum.append([i,0,0])
cdef int fold_number = 1
cdef list items = range(nrOfNodes)
cdef float timer = time.time()
cdef np.ndarray fuz_mean_occ = np.array([])
cdef crossValMethods.CrossValMethods method = crossValMethods.CrossValMethods()
cdef f_type methodToPass = method.flatCrossVal
lbp = LoopyBeliefPropagation()
#TODO add tzpe when changed to cdef class
tools = tool.LBPTools(nrOfNodes, graph, defaultClassMat, lbpSteps, lbpThreshold)
fold_sum = tools.crossVal(items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
tools.k_fold_cross_validation, self.prepareFoldClassMat,
lbp.lbp, None, methodToPass, False, None, None, None)
此处编译失败并出现错误:
Error compiling Cython file:
------------------------------------------------------------
tools = tool.LBPTools(nrOfNodes, graph, defaultClassMat, lbpSteps, lbpThreshold)
fold_sum = tools.crossVal(items, numberOfFolds, graph, nrOfNodes,
defaultClassMat, lbpSteps, lbpThreshold,
tools.k_fold_cross_validation, self.prepareFoldClassMat,
lbp.lbp, None, methodToPass, False, None, None, None)
^
------------------------------------------------------------
FlatLBP.pyx:66:50: Cannot convert 'f_type' to Python object
好吧,我知道符号很可怕,代码也很混乱。 我只想知道是否有办法将cdef方法作为参数传递,或者总是将其转换为python对象?如果有办法,我做错了什么? 我将非常感激任何帮助。 我没有任何C语言的经验,我主要是Java的家伙,有人让我使用python,然后cython。你知道吗
谨致问候, 阿德里安
目前没有回答
相关问题 更多 >
编程相关推荐