Scikit learn 从Cython中的*.pyd文件导入类拆分器

Scikit learn 从Cython中的*.pyd文件导入类拆分器,scikit-learn,cython,Scikit Learn,Cython,我正在尝试编写sklearn类sklearn.tree.\u splitter.splitter的子类。 我用cython编写了以下子类: from libc.string cimport memcpy import numpy as np cimport numpy as np np.import_array() from sklearn.tree._splitter import Splitter, SplitRecord from ._utils import rand_int c

我正在尝试编写sklearn类sklearn.tree.\u splitter.splitter的子类。 我用cython编写了以下子类:

from libc.string cimport memcpy 
import numpy as np
cimport numpy as np
np.import_array()

from sklearn.tree._splitter import Splitter, SplitRecord

from ._utils import rand_int

cdef double INFINITY = np.inf

cdef class StochasticSplitter(Splitter):
    """Splitter for finding a split stochastically."""
    def __reduce__(self):
        return (StochasticSplitter, (self.criterion,
                                     self.max_features,
                                     self.min_samples_leaf,
                                     self.min_weight_leaf,
                                     self.random_state,
                                     self.presort), self.__getstate__())

    cdef int node_split(self, double impurity, SplitRecord* split,
                        SIZE_t* n_constant_features) nogil except -1:
        """ Find the best split on node samples[start:end]
        Returns -1 in case of failure to allocate memory (and raise MemoryError)
        or 0 otherwise.
        """
        " My Logic...."

        # Return values
        split[0] = chosen_split
        n_constant_features[0] = n_total_constants
        return 0
但当我试图编译该文件时,出现了以下错误:

“拆分器”不是类型名称

“SplitRecord”不是类型标识符

为什么会这样? 我如何导入Splitter和SplitRecord以便在cdef类中使用它们

注: -我没有_splitter模块的.pyx和.pxd,所以我无法导入这些类。我只有.pyd文件。 -我想将这个类定义为一个cdef类(而不是一个普通的python类),因为函数节点_split使用指针(我不知道如何在python中使用指针)

我在网上和这里搜索,发现了萨米利亚式的问题,但没有一个答案对我有帮助。。。 有人能帮我吗?

您需要
cimport
文件:

from sklearn.tree._splitter cimport Splitter, SplitRecord
import
在模块运行时发生,因此不会向Cython提供任何信息。它也没有提供Cython需要的类的内部结构的信息
cimport
在Cython编译模块时发生,因此让Cython知道
Splitter
是一个
cdef类
,因此您应该能够从中继承

Cython需要的信息在编译的
.pyd
文件中确实不可用。您必须拥有
.pxd
文件。它还需要安装正确的路径,以便Cython找到它(即在名为
sklearn\tree\
的目录中以及Python路径上)

鉴于
sklearn
是开源的,没有理由不提供必要的文件。看见如果您的问题是由于没有管理员权限而无法完全安装sklearn,则可以将其安装到用户目录:

pip install --user -U sklearn
正确安装sklearn比逐个复制文件要好。

您需要
cimport
文件:

from sklearn.tree._splitter cimport Splitter, SplitRecord
import
在模块运行时发生,因此不会向Cython提供任何信息。它也没有提供Cython需要的类的内部结构的信息
cimport
在Cython编译模块时发生,因此让Cython知道
Splitter
是一个
cdef类
,因此您应该能够从中继承

Cython需要的信息在编译的
.pyd
文件中确实不可用。您必须拥有
.pxd
文件。它还需要安装正确的路径,以便Cython找到它(即在名为
sklearn\tree\
的目录中以及Python路径上)

鉴于
sklearn
是开源的,没有理由不提供必要的文件。看见如果您的问题是由于没有管理员权限而无法完全安装sklearn,则可以将其安装到用户目录:

pip install --user -U sklearn

您最好正确安装sklearn,而不是逐个复制文件。

但是当我尝试cimport类时,在编译时会出现以下错误:找不到cimported模块“sklearn.tree.\u splitter”和“sklearn\tree\u splitter.pxd”(我确实没有.pxd文件,只有.pyd文件)。难道没有其他方法导入模块吗?我应该更仔细地阅读问题的结尾-您提到了cimport。。。。为什么你不能下载这个文件?真的没有其他方法了——Cython需要这些信息来创建
cdef类。。我没想过。我试试这个。我想下载_spliter.pyx,但是_spliter.pyx cimport _criteria.criteria,以及_criteria本身cimport大约4个其他模块,所以它看起来安静无休止。只下载.pxd文件就够了吗?编辑:好的,我试过了(我下载了_splitter.pxd和_criteria.pxd-tp与我的文件在同一个目录下,在我的文件中我移植了它们并从sklearn Paket导入了_splitter.pyd),但是现在,在sklearn.tree的
行中找不到错误“sklearn\tree\u splitter.pxd”。\u splitter导入splitter,SplitRecord
…请参见编辑。我认为您应该正确安装sklearn,而不是一次下载一个文件。但是,当我尝试cimport类时,在编译时会出现以下错误:找不到cimported模块“sklearn.tree.\u splitter”和“sklearn\tree\u splitter.pxd”(我确实没有.pxd文件,只有.pyd文件)。难道没有其他方法导入模块吗?我应该更仔细地阅读问题的结尾-您提到了cimport。。。。为什么你不能下载这个文件?真的没有其他方法了——Cython需要这些信息来创建
cdef类。。我没想过。我试试这个。我想下载_spliter.pyx,但是_spliter.pyx cimport _criteria.criteria,以及_criteria本身cimport大约4个其他模块,所以它看起来安静无休止。只下载.pxd文件就够了吗?编辑:好的,我试过了(我下载了_splitter.pxd和_criteria.pxd-tp与我的文件在同一个目录下,在我的文件中我移植了它们并从sklearn Paket导入了_splitter.pyd),但是现在,在sklearn.tree的
行中找不到错误“sklearn\tree\u splitter.pxd”。\u splitter导入splitter,SplitRecord
…请参见编辑。我认为你应该正确安装sklearn,而不是一次下载一个文件