2016-06-09 4 views
2

У меня есть код, где я строю огромное дерево, и мне нужно его сохранить для дальнейшего использования. К несчастью, кажется, я не могу расчехлять scipy.spatial.KDTree объектов.Невозможно рассортировать объекты 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 

Учитывая это, есть способ замариновать его? или, по крайней мере, сохранить часть объекта, которая может быть использована для быстрого восстановления дерева? В противном случае существуют другие быстрые опции, кроме scipy.spatial.KDTree?

ответ

5

Использование cKDTree вместо KDTree следующим образом:

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

Это кажется довольно прохладную особенность cKDTree, они должны definely упомянуть об этом в документации –