如何最好地存储Python对象以供以后评估?

时间:2018-12-27 01:57:36

标签: python object scipy

我已经使用scipy函数编写了以下python代码。函数f的特定形式无关紧要。

import numpy as np
from scipy.interpolate.interpnd import LinearNDInterpolator    

def f(x, y):
    s = np.hypot(x, y)
    phi = np.arctan2(y, x)
    tau = s + s*(1-s)/5 * np.sin(6*phi)
    return 5*(1-tau) + tau

npts = 200
px, py = np.random.choice(x, npts), np.random.choice(y, npts)
ip = LinearNDInterpolator((px, py), f(px,py))

ip是哪种对象?我想将其存储在文件中,并稍后对其进行评估,例如下面的示例。

x = np.linspace(-1,1,100)
y = np.linspace(-1,1,100)
X, Y = np.meshgrid(x,y)
Ti = ip((X, Y))

将对象ip存储在文件中的好方法是什么?

3 个答案:

答案 0 :(得分:4)

您的对象ip是类scipy.interpolate.interpnd.LinearNDInterpolator的实例。如果要将完整的对象存储到文件,则可以使用python标准库中的pickle模块。

拾取对象并将其写入(二进制)文件非常简单:

import pickle
with open('data.pickle', 'wb') as f:
    # Write object `ip` to file
    pickle.dump(ip, f, pickle.HIGHEST_PROTOCOL)

稍后再次从文件中加载对象同样简单:

with open('data.pickle', 'rb') as f:
    # Read out object `ip` from file
    ip = pickle.load(f)

酸洗确实有一些缺点值得一提。首先,您编写的泡菜文件是不可读的。其次,由于安全隐患,绝对不能加载从不可信来源收到的泡菜文件。

答案 1 :(得分:3)

鉴于您知道f并且可以访问scipy,因此我认为最简单的方法是只存储xy。这样可以避免二进制转储的许多陷阱,并允许您以文本格式存储。

要存储,您可以使用np.savetxt来存储数据:

np.savetxt('mystash.txt', np.stack((px, py), axis=1))

然后您可以基于np.loadtxt进行简单的加载过程:

def load_interp(fname):
    px, py = np.loadtxt(fname, unpack=True)
    return LinearNDInterpolator((px, py), f(px,py))

此解决方案生成了一个非常易于阅读的文本文件,其中包含两列数据,分别对应于pxpy的匹配条目。该文件是完全可移植且可编辑的。它是独立于语言的,所有这些都需要在加载程序中增加一行。

答案 2 :(得分:-1)

您可以考虑使用pickle进行Python特定的对象序列化。否则,您必须考虑使用jsonxml格式。访问链接以了解更多信息