Scikit learn 如何将`sklearn.neights.KDTree`对象转储到hdf5?

Scikit learn 如何将`sklearn.neights.KDTree`对象转储到hdf5?,scikit-learn,pickle,hdf5,kdtree,Scikit Learn,Pickle,Hdf5,Kdtree,根据sklearn.neights.KDTree,我们可以使用pickle将KDTree对象转储到磁盘。 然而,无论是卸载还是装载,以及存储消耗,它都非常缓慢 是否可以将其转储为hdf5格式 您可以使用\uuu getstate\uu和\uu getstate\uu。大多数内部量为数组或标量类型,因此适用于hdf5。 还有一点工作要做,因为\uuu getstate\uuu返回的最后一个术语是一个函数,我们可以将它转换为字符串,使用pickle.dumps进行hdf5存储 如果您觉得这很有趣,您

根据
sklearn.neights.KDTree
,我们可以使用pickle将
KDTree
对象转储到磁盘。 然而,无论是卸载还是装载,以及存储消耗,它都非常缓慢


是否可以将其转储为hdf5格式

您可以使用
\uuu getstate\uu
\uu getstate\uu
。大多数内部量为数组或标量类型,因此适用于hdf5。 还有一点工作要做,因为
\uuu getstate\uuu
返回的最后一个术语是一个函数,我们可以将它转换为字符串,使用
pickle.dumps
进行hdf5存储

如果您觉得这很有趣,您可以找到
KDTree
的源代码,并通过
检查返回值

from sklearn.neighbors import KDTree
import h5py
import pickle

"""
You may find the source code of KDTree from link below
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/neighbors/binary_tree.pxi
"""

__all__ = ["KDTreeH5"]


class KDTreeH5(KDTree):
    def dump(self, file):
        """
        file: str or HDF group
        """
        if not isinstance(file, h5py.Group):
            file = h5py.File(file)

        state = list(self.__getstate__())
        assert len(state) == 12
        # convert dist_metric to string for hdf5 storage.
        state[-1] = pickle.dumps(state[-1])
        for i, v in enumerate(state):
            file[str(i)] = v

    @classmethod
    def load(cls, file):
        """
        file: str or HDF group
        """
        if not isinstance(file, h5py.Group):
            file = h5py.File(file, 'r')

        state = [None] * 12
        for i in range(12):
            state[i] = file[str(i)].value
        # recover dist_metric from string.
        state[-1] = pickle.loads(state[-1])

        obj = cls.__new__(cls)
        obj.__setstate__(state)
        return obj