在Python中保存KDTree对象?

2024-10-01 13:24:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Scipy的KDTree实现来读取一个300 MB的大文件。现在,有没有一种方法可以将数据结构保存到磁盘并再次加载,还是每次启动程序时都要从文件中读取原始点并构造数据结构?我正在构建KDTree,如下所示:

def buildKDTree(self):
        self.kdpoints = numpy.fromfile("All", sep=' ')
        self.kdpoints.shape = self.kdpoints.size / self.NDIM, NDIM
        self.kdtree = KDTree(self.kdpoints, leafsize = self.kdpoints.shape[0]+1)
        print "Preparing KDTree... Ready!"

有什么建议吗?在


Tags: 文件方法self程序numpy数据结构defmb
1条回答
网友
1楼 · 发布于 2024-10-01 13:24:52

KDtree使用嵌套类定义其节点类型(innernode、leafnode)。Pickle只适用于模块级的类定义,因此嵌套类会使其中断:

import cPickle

class Foo(object):
    class Bar(object):
        pass

obj = Foo.Bar()
print obj.__class__
cPickle.dumps(obj)

<class '__main__.Bar'>
cPickle.PicklingError: Can't pickle <class '__main__.Bar'>: attribute lookup __main__.Bar failed

但是,有一种(黑客)的解决方法,就是猴子将类定义修补到scipy.spatial.kdtreeat模块范围,这样pickler就可以找到它们。如果所有读写pickled KDtree对象的代码都安装了这些补丁,那么这个黑客攻击应该可以正常工作:

^{pr2}$

输出:

<class 'scipy.spatial.kdtree.innernode'>
"ccopy_reg\n_reconstructor\np1\n(cscipy.spatial.kdtree\nKDTree\np2\nc_
[3 4] [3 4]

相关问题 更多 >