是否有正式的方法来安全保存和加载sympy对象(通过互联网发送)?
使用np.save
和np.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
我正在考虑使用srepr
将Eq(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不同,因为我对二进制格式没问题。
答案 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
类(我忘了名字)。