如何安全保存和加载Synspy对象



是否有一种官方方法可以安全保存和加载Synspy对象(用于通过Internet发送)?

使用np.savenp.load给出以下例外。

Traceback (most recent call last):
  File "testSave.py", line 19, in <module>
    print np.load("out.npy", out)
  File "C:Python27libsite-packagesnumpylibnpyio.py", line 415, in load
    if mmap_mode:
  File "C:Python27libsite-packagessympycorerelational.py", line 195, in __nonzero__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

我正在考虑使用sreprEq(5*x + 12 - 8, 12*x - 10)转换为Equality(Add(Add(Mul(Integer(5), Symbol('x')), Integer(12)), Integer(-8)), Add(Mul(Integer(12), Symbol('x')), Integer(-10))),但据我所知,从文本中加载它的唯一方法是使用parse,但我希望不从Internet执行字符串。

这是区别的问题:sympy:安全解析字符串,因为我对二进制格式很好。

pickle似乎有效

对于h1(来自以前的So问题):

In [52]: h1
Out[52]: -exp(Abs(sqrt(x**2 + y**2)/pi - 1))*Abs(sin(x)*cos(y))
In [53]: type(h1)
Out[53]: sympy.core.mul.Mul
In [47]: import pickle
In [48]: pickle.dumps(h1)
Out[48]: b'x80x03csympy.core.mulnMulnqx00csympy.core.numbersnNegativeOnenqx01Jxffxffxffxffx85qx02Rqx03}qx04bcsympy.functions.elementary.complexes...PRqQ}qRbx86qSRqT}qUbx86qVRqW}qXbx86qYRqZ}q[bx85q\Rq]}q^bx85q_Rq`}qabx87qbRqc}qdb.'
In [50]: with open('text.txt','wb') as f:
    ...:     pickle.dump(h1,f)
    ...:       
In [51]: with open('text.txt','rb') as f:
    ...:     print(pickle.load(f))
    ...:     
-exp(Abs(sqrt(x**2 + y**2)/pi - 1))*Abs(sin(x)*cos(y))

np.save如果无法将对象保存为数组,则诉诸pickle,但显然直接使用pickle更可靠。 sympy对象不会从 numpy继承(至少基本的对象)。

pickle取决于sympy类定义自己的编码/解码功能(我忘记了名称)。

最新更新