Sympy不计算2x但能计算x*2

7 投票
2 回答
562 浏览
提问于 2025-04-16 12:21

我正在使用Sympysympify函数来简化两个表达式,这样我就可以比较它们是否相等。

举个例子:

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)?我故意把这个情况排除在上面的正则表达式之外,因为它实在是太模糊了。

撰写回答