Sympy不计算2x但能计算x*2
我正在使用Sympy的sympify函数来简化两个表达式,这样我就可以比较它们是否相等。
举个例子:
expr1 = sympify("(2 * x) + (x + 10)")
expr2 = sympify("(x + 10) + (x * 2)")
if expr1 == expr2:
print "Congrats those are essentially the same!"
但是,当我使用2x这种形式,而不是x*2时,我遇到了一个解析错误,比如:
expr1 = sympify("2x + (x + 10)")
有没有办法让sympy理解2x这种形式呢?
如果不行,有没有其他库可以支持这种形式?
2 个回答
2
SymPy的开发版本可以解析这样的表达式。你可以查看这个链接了解更多信息:http://docs.sympy.org/dev/modules/parsing#sympy.parsing.sympy_parser.implicit_multiplication_application。不过在sympify
中,这个功能默认是没有开启的,因为sympify
只处理一些非常基础的Python语法,比如把数字和未定义的名称包裹起来,以及把^
转换成**
。不过链接里有个例子可以教你怎么使用这个功能。
需要注意的是,目前这个功能也适用于隐式函数的应用。可能这两个功能应该分开处理。
编辑:这些功能正在通过一个拉取请求进行分离。
3
好吧,你可以修改sympy的词法分析器(或者解析器/语法/其他的东西)。
你也可以用一个函数来包装它,这个函数可以帮你转换输入的字符串,像这样:
>>> import re
>>> expr = '2x + 1'
>>> re.sub(r"(\d+)(\w+)", r"(\1 * \2)", expr)
'(2 * x) + 1'
但是你要问问自己,为什么一开始没有这种表示法。
比如说,下面这些都是有效的Python代码,虽然我很久没碰过sympy了,但我敢打赌它们在sympy中也代表着除了乘法以外的意思:
0x32 # hex for 50
5e-3 # 0.005
2j # 2 * sqrt(-1) (so that one *is* multiplication, but by 1j, not j!)
15L # 15 (L used to represent long integers in python)
那么x2
是什么意思呢?它是一个名为x2
的变量,还是表示(x * 2)
?我故意把这个情况排除在上面的正则表达式之外,因为它实在是太模糊了。