<p>好吧,迈克的解决方案似乎很好,但同时我发现了另一个:</p>
<p>Rbf对象只有两个部分不能直接进行pickle,而且它们很容易从头创建。因此,我的代码现在只保存数据部分:</p>
<pre><code>import scipy.interpolate as inter
import numpy as np
import cPickle
x = np.array([[1,2,3],[3,4,5],[7,8,9],[1,5,9]])
y = np.array([1,2,3,4])
rbfi = inter.Rbf(x[:,0], x[:,1], x[:,2], y)
RBFfile = open('picklefile','wb')
RBFpickler = cPickle.Pickler(RBFfile,protocol=2)
# RBF can't be pickled directly, so save everything required for reconstruction
RBFdict = {}
for key in rbfi.__dict__.keys():
if key != '_function' and key!= 'norm':
RBFdict[key] = rbfi.__getattribute__(key)
RBFpickler.dump(RBFdict)
RBFfile.close()
</code></pre>
<p>这给了我一个包含对象中存储的所有信息的文件。<code>rbfi._function()</code>和<code>rbfi.norm</code>不保存。幸运的是,只要初始化任何(任意简单的)Rbf对象,就可以从头开始重新创建它们:</p>
^{pr2}$
<p>然后,此对象的数据部分将替换为保存的数据:</p>
<pre><code>RBFfile = open('picklefile','rb')
RBFunpickler = cPickle.Unpickler(RBFfile)
RBFdict = RBFunpickler.load()
RBFfile.close()
## replace rbfi's contents with what was saved ##
for key,value in RBFdict.iteritems():
rbfi.__setattr__(key, value)
>>> rbfi(2,3,4)
array(1.4600661386382146)
</code></pre>
<p>显然,甚至没有必要给新的Rbf对象提供与原始对象相同的维数,因为所有这些都将被覆盖。在</p>
<p>也就是说,Mike的解决方案可能是更普遍适用的解决方案,而这个方案更独立于平台。我有过在平台之间移动pickled Kriging模型的问题,但是这种RBF模型的方法似乎更健壮,但是我还没有对它进行过太多的测试,所以没有给出任何保证。在</p>