【发布时间】:2016-06-26 16:50:42
【问题描述】:
在 sympy 0.7.6 中,对于 modules='sympy' 和 modules='numpy' 选项的以下代码,我没有遇到任何问题。现在使用 sympy v0.1,使用 modules='numpy' 进行评估会引发 ZeroDivisionError:
import sympy
x, y = sympy.symbols(['x', 'y'])
expr = sympy.Piecewise((1/x, y < -1), (x, y <= 1), (1/x, True))
f_sympy = sympy.lambdify([x, y], expr, modules='sympy')
f_numpy = sympy.lambdify([x, y], expr, modules='numpy')
print f_sympy(0, 1) # performs well
print f_numpy(0, 1) # issue: ZeroDivisionError
似乎分段函数在条件为 modules='numpy' 之前求值。
我的问题是:
这种行为正常吗?
如果是这样,为什么以及如何定义分段表达式并在没有 sympy.lambdify 过程的情况下像使用 numpy 模块一样快速评估它?
编辑:
发现在我的情况下解决方案是theano:
import sympy
x, y = sympy.symbols(['x', 'y'])
f = sympy.Piecewise((1/x, y < -1), (x, y <= 1), (1/x, True))
from sympy.printing.theanocode import theano_function
f_theano = theano_function([x, y], [f])
print f_theano(0, 1) # OK, return 0
【问题讨论】:
标签: numpy sympy piecewise lambdify