Mar*_*Omo 1 python numpy sympy
是否有安全保存和加载 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
Run Code Online (Sandbox Code Playgroud)
我用的是考虑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,但我不喜欢从互联网EXEC字符串。
这与问题SymPy: Safely parsing strings as I am ok with binary 格式不同。
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))
Run Code Online (Sandbox Code Playgroud)
np.save诉诸pickle如果它可以在该对象不是保存为一个数组,但显然采用pickle直接更加可靠。 sympy对象不继承自numpy(至少基本对象不继承)。
pickle取决于sympy定义自己的编码/解码函数的类(我忘记了名字)。