Python 无法pickle scipy.spatial.KDTree对象

Python 无法pickle scipy.spatial.KDTree对象,python,scipy,pickle,Python,Scipy,Pickle,我有一个代码,我建立了一个巨大的树,我需要保存它供以后使用。 不幸的是,我似乎无法picklescipy.spatial.KDTree对象 事实上,当我运行此程序时: import pickle import scipy.spatial tree=scipy.spatial.KDTree([[1,2,3]]) pickle.dump(tree,open('tree.p','wb')) 我得到一个错误: Traceback (most recent call last): File "<

我有一个代码,我建立了一个巨大的树,我需要保存它供以后使用。 不幸的是,我似乎无法pickle
scipy.spatial.KDTree
对象

事实上,当我运行此程序时:

import pickle
import scipy.spatial
tree=scipy.spatial.KDTree([[1,2,3]])
pickle.dump(tree,open('tree.p','wb'))
我得到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/pickle.py", line 1370, in dump
    Pickler(file, protocol).dump(obj)
  File "/usr/lib64/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib64/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib64/python2.7/pickle.py", line 419, in save_reduce
    save(state)
  File "/usr/lib64/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/usr/lib64/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/usr/lib64/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib64/python2.7/pickle.py", line 401, in save_reduce
    save(args)
  File "/usr/lib64/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python2.7/pickle.py", line 562, in save_tuple
    save(element)
  File "/usr/lib64/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib64/python2.7/pickle.py", line 748, in save_global
    (obj, module, name))     pickle.PicklingError: Can't pickle <class 'scipy.spatial.kdtree.leafnode'>: it's not found as scipy.spatial.kdtree.leafnode
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib64/python2.7/pickle.py”,第1370行,在转储中
Pickler(文件,协议).dump(obj)
文件“/usr/lib64/python2.7/pickle.py”,第224行,在转储中
自我保存(obj)
文件“/usr/lib64/python2.7/pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“/usr/lib64/python2.7/pickle.py”,第419行,在save\u reduce中
保存(状态)
文件“/usr/lib64/python2.7/pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存目录中的文件“/usr/lib64/python2.7/pickle.py”,第649行
self.\u batch\u setitems(obj.iteritems())
文件“/usr/lib64/python2.7/pickle.py”,第663行,在批处理设置项中
保存(v)
文件“/usr/lib64/python2.7/pickle.py”,第331行,保存
自我保存(obj=obj,*rv)
文件“/usr/lib64/python2.7/pickle.py”,第401行,在save\u reduce中
保存(args)
文件“/usr/lib64/python2.7/pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“/usr/lib64/python2.7/pickle.py”,第562行,在save_tuple中
保存(元素)
文件“/usr/lib64/python2.7/pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
文件“/usr/lib64/python2.7/pickle.py”,第748行,在save_global中
(对象,模块,名称))pickle.PicklingError:无法pickle:找不到它作为scipy.spatial.kdtree.leafnode

鉴于此,有没有办法腌制它?或者至少保存一部分可以用来快速重建树的对象?否则,除了scipy.spatial.KDTree之外,还有其他快速选项吗?

使用cKDTree而不是KDTree,如下所示:

import pickle
import scipy.spatial
tree=scipy.spatial.cKDTree([[1,2,3]])
pickle.dump(tree,open('tree.p','wb'))

这似乎是cKDTree的一个非常酷的特性,他们应该在文档中明确提到它