2017-01-03 2 views
0

Прежде всего, вот схема рабочего процесса, которую я хочу сделать: 1. Используйте sympy для «выполнения математики» и разработайте некоторые выражения 2. Lambdify соответствующие выражения 3. Сохраните соответствующие лямбда-функции в файле 4. Загрузите их в самостоятельную часть моего кодавыгрузите функцию лямбда в файл и загрузите ее в другую функцию

Все идет хорошо, пока шаг 3. я пробовал разные вещи, и, в частности, после прочтения this Это минималистический пример, который я хотел бы сделать:

import sympy as sp 
import dill as pickle 

x, y = sp.symbols("x, y") 

f_example = 2*x**2 + 2*x*y 
f_lbda= sp.lambdify((x, y),f_example) 
pickle.settings['recurse'] = True 
fileW = open('file_where_I_dump.dill', 'wb') 
# the following line crashes 
pickle.dump([f_lbda, f_lbda], fileW) 
fileR = open('file_where_I_dump.dill', 'rb') 
f_lbda_loaded = pickle.load(fileR) 

Я получаю эту ошибку (после того, как важного числа During handling of the above exception, another exception occurred:

ValueError: 'axis' entry is out of bounds 

Я пропускаю что-то важное здесь?

Примечание: когда я дам выражение sympy вместо lambdify функции после pickle.load, все будет хорошо. Но это не совсем тот рабочий процесс, в котором я нуждаюсь!

Благодарим за помощь!

+0

https://docs.python.org/2/library/json.html –

+0

Я нашел эту аналогичную проблему. Помогло ли вам решение? https://github.com/uqfoundation/dill/issues/104 –

ответ

0

Вот немного измененная версия вашего кода (см. Ниже): Это похоже на ошибку. Обратите внимание, что травление выражения лямбда разрушает исходный символический объект выражения!

Я - dill автор. Я предлагаю опубликовать его как вопрос github - если вы опубликуете его как вопрос dill, я буду копаться в нем, а затем подтянуть его до sympy.

>>> import sympy as sp 
>>> x,y = sp.symbols('x,y') 
>>> f_ex = 2*x**2 + 2*x*y 
>>> f_la = sp.lambdify((x,y),f_ex) 
>>> f_ex 
2*x**2 + 2*x*y 
>>> import dill 
>>> dill.settings['recurse'] = True 
>>> la = dill.loads(dill.dumps(f_la)) 
>>> la 
<function <lambda> at 0x10b4ed668> 
>>> f_ex 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/core/basic.py", line 392, in __repr__ 
    return sstr(self, order=None) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/printing/str.py", line 748, in sstr 
    s = p.doprint(expr) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/printing/printer.py", line 233, in doprint 
    return self._str(self._print(expr)) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/printing/printer.py", line 257, in _print 
    return getattr(self, printmethod)(expr, *args, **kwargs) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/printing/str.py", line 51, in _print_Add 
    terms = self._as_ordered_terms(expr, order=order) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/printing/printer.py", line 271, in _as_ordered_terms 
    return expr.as_ordered_terms(order=order) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/core/expr.py", line 888, in as_ordered_terms 
    terms, gens = self.as_terms() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/core/expr.py", line 920, in as_terms 
    coeff = complex(coeff) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/core/expr.py", line 229, in __complex__ 
    result = self.evalf() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sympy/core/evalf.py", line 1377, in evalf 
    prec = dps_to_prec(n) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mpmath/libmp/libmpf.py", line 67, in dps_to_prec 
    return max(1, int(round((int(n)+1)*3.3219280948873626))) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2293, in amax 
    out=out, **kwargs) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/_methods.py", line 26, in _amax 
    return umr_maximum(a, axis, None, out, keepdims) 
ValueError: 'axis' entry is out of bounds 
0

В качестве обходного пути я предлагаю следующее:

from sympy import * 
from cloudpickle import dump, load 

var("x, y") 
f_example = 2*x**2 + 2*x*y 
f_lbda= lambdify((x, y),f_example) 

with open('file_where_I_dump_flbda', 'wb') as f: 
    dump((f_lbda), f) 

В другом коде, который я имею, где я осложненное SymPy выражения, которые я lambdify для последующего использования, используя dump и load из cloudpickle работ! хорошо

Смежные вопросы