2017-03-01 15 views
0

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 

私はEquality(Add(Add(Mul(Integer(5), Symbol('x')), Integer(12)), Integer(-8)), Add(Mul(Integer(12), Symbol('x')), Integer(-10)))Eq(5*x + 12 - 8, 12*x - 10)を回しsreprを使用して検討していたが、私の知る限りでは、テキストからそれをロードする唯一の方法は、parseを使用していたが、私は、インターネットから文字列をexecしないことを好むだろう。

これは、質問SymPy: Safely parsing stringsと私がバイナリ形式で問題ないとは異なります。

答えて

3

pickleは、(以前のSOの質問から)h1について

を動作するようです:pickle

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を使用できない場合より信頼性が高い。 sympyオブジェクトはnumpyから継承されません(少なくとも基本オブジェクトは継承しません)。

pickleは、sympy独自のエンコード/デコード機能を定義するクラスに依存します(名前は忘れてしまいます)。

関連する問題