如何安全地保存和加载sympy对象

时间:2017-03-01 04:16:12

标签: python numpy sympy

是否有正式的方法来安全保存和加载sympy对象(通过互联网发送)?

使用np.savenp.load会出现以下异常。

Traceback (most recent call last):
  File "testSave.py", line 19, in <module>
    print np.load("out.npy", out)
  File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 415, in load
    if mmap_mode:
  File "C:\Python27\lib\site-packages\sympy\core\relational.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但我会不喜欢从互联网上执行字符串。

这与问题SymPy: Safely parsing strings不同,因为我对二进制格式没问题。

1 个答案:

答案 0 :(得分:3)

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'\x80\x03csympy.core.mul\nMul\nq\x00csympy.core.numbers\nNegativeOne\nq\x01J\xff\xff\xff\xff\x85q\x02Rq\x03}q\x04bcsympy.functions.elementary.complexes...PRqQ}qRb\x86qSRqT}qUb\x86qVRqW}qXb\x86qYRqZ}q[b\x85q\\Rq]}q^b\x85q_Rq`}qab\x87qbRqc}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类(我忘了名字)。