分段函数和numpy模块的sympy.lambdify错误

分段函数和numpy模块的sympy.lambdify错误,numpy,sympy,piecewise,lambdify,Numpy,Sympy,Piecewise,Lambdify,在Sympy0.7.6中,我对modules='sympy'和modules='numpy'选项的以下代码没有任何问题。现在,在sympy v0.1中,使用modules='numpy'进行评估时会产生一个错误: 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(

在Sympy0.7.6中,我对modules='sympy'和modules='numpy'选项的以下代码没有任何问题。现在,在sympy v0.1中,使用modules='numpy'进行评估时会产生一个错误:

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
导入sympy
x、 y=符号(['x','y'])
expr=sympy.分段((1/x,y<-1),(x,y我删除了我的另一个答案(如果你已经看到的话)。有一个更简单的解决方案

ZeroDivision错误的产生是因为lambda x,y:select([less(y,-1),less_equal(y,1),True],[1/x,x,1/x],default=nan)
的lambda x,y:select([less(y,-1),[1/x,x,1/x],default=nan)。问题是,传入x=0会导致Python计算
1/0
,从而引发错误

但是NumPy除以零就可以了。它将发出警告,但在其他情况下工作正常(它给出
inf
),在本例中没有问题,因为实际上没有使用
inf

因此,解决方案是将
lambdify
的输入包装为numpy数组,也就是说,而不是

f_numpy(0, 1)
使用


如果您感兴趣,我们将对此进行讨论。

谢谢。现在对我来说,这更清楚了。我将尝试“numpy.array”解决方案。目前,我使用调用“lambdarepr”和(不幸的是)的解决方案“eval”:这对我来说很有效,但不是很“pythonic”。这种解决方案的缺点是什么?我不知道你可怜的人的lambdify如何解决这个问题。据我所知,你的函数所做的每件事,
symphy.lambdify
也有,但是
symphy.lambdify
也有更多的功能,所以我建议使用它。
f_numpy(0, 1)
f_numpy(array(0), array(1))