我已经使用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
存储在文件中的好方法是什么?
答案 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
,因此我认为最简单的方法是只存储x
和y
。这样可以避免二进制转储的许多陷阱,并允许您以文本格式存储。
要存储,您可以使用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))
此解决方案生成了一个非常易于阅读的文本文件,其中包含两列数据,分别对应于px
和py
的匹配条目。该文件是完全可移植且可编辑的。它是独立于语言的,所有这些都需要在加载程序中增加一行。
答案 2 :(得分:-1)
您可以考虑使用pickle进行Python特定的对象序列化。否则,您必须考虑使用json
或xml
格式。访问链接以了解更多信息