SymPy 自动处理表达式

发布于 2024-11-16 20:11:48 字数 241 浏览 4 评论 0原文

我一直在使用 SymPy 将表达式转换为乳胶(然后由 Matplotlib 渲染)。例如,

from sympy import latex, sympify
from sympy.abc import x

str = '2*x + 3*x'

TeX = latex(sympify(str))

问题是它会自动处理表达式,因此 2*x + 3*x 自动变为 5*x 等;这不是我想要的(不要问!)。

I have been using SymPy to convert expressions into latex (to then be rendered by Matplotlib). e.g.

from sympy import latex, sympify
from sympy.abc import x

str = '2*x + 3*x'

TeX = latex(sympify(str))

The problem is that it automatically processes the expression, so 2*x + 3*x automatically becomes 5*x etc; which is not what I want (don't ask!).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

热情消退 2024-11-23 20:11:48

Sympy 的 Add 类处理符号的添加。您可以提供关键字参数来停止自动收集术语。

from sympy import Add
from sympy.abc import x

eq = Add(2*x, 3*x, evaluate=False)

# this will print: 2*x + 3*x
print eq

根据您对 phimuemue 评论的回复,这可能不完全是您想要的。

Sympy's Add class handles the addition of symbols. You can provide a keyword argument to stop the automatic collection of terms.

from sympy import Add
from sympy.abc import x

eq = Add(2*x, 3*x, evaluate=False)

# this will print: 2*x + 3*x
print eq

This may not be exactly what you want based on your reply to phimuemue's comment.

提笔落墨 2024-11-23 20:11:48

实际上,当您调用 sympify(str) 时,它会尝试解析表达式并将它们转换为默认类。在这种情况下,将调用 Add(2*x,2*x) (默认参数 evalaute=True),因此变为 5*x。如果你想避免它,你必须调用 Add(2*x,3*x,evaluate=False) 或使用一些全局变量并检查 init 方法core->AssocOp 类operation.py

我正在这样做

 try:
        import __builtin__
        evaluate_expr=__builtin__.evaluate_expr
    except AttributeError ,ex:
        pass 

    if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) :

**注意 - sympy 使用函数的缓存,因此如果您调用相同的函数(例如:sympy("2*x+3*x") )两次.1st一次使用全局变量evaulate=True,第二次使用evaluate=False。在这两种情况下,由于缓存,您将得到相同的结果。
因此,您需要更新 core->expr 类中的 (add ,mul ) 等方法。类似下面的内容

def __add__(self, other):
        #simplifychange:
        evaluate_expr=self.get_evaluate()
        return Add(self, other,evaluate=evaluate_expr)

但我建议如果你不使用评估=False会更好。同情的行为将会发生巨大的变化。像我在这篇帖子中遇到的问题

Actually when you call sympify(str) it tries to parse expression and convert them into the default classes. In this case Add(2*x,2*x) will be called (with default parameter evalaute=True) so this became 5*x. If you want to avoid it either you have to call Add(2*x,3*x,evaluate=False) or use some global variable and check in init method of AssocOp class in core-> operation.py

i am doing this

 try:
        import __builtin__
        evaluate_expr=__builtin__.evaluate_expr
    except AttributeError ,ex:
        pass 

    if ((not options.pop('evaluate', True)) or (evaluate_expr==False)) :

**Note - sympy use caching for function , so if you call same function (say :sympy("2*x+3*x") )two times .1st time with your gloabl variable evalute=True and 2nd time with evaluate=False. in both cases becuase of caching you will get same result.
So you need to update methods like (add ,mul ) in core->expr class. something like below

def __add__(self, other):
        #simplifychange:
        evaluate_expr=self.get_evaluate()
        return Add(self, other,evaluate=evaluate_expr)

But i will suggest it would be better if you dont use evaluate=False. Behavior of sympy will change dramatically. problems like i was facing in this post

一片旧的回忆 2024-11-23 20:11:48

>>>导入重新

>>> re.sub("(^|[\(\[\{\+\-\*/ ,\:=])(\-?[0-9]*\.?[0-9]+)", "\\1Dummy('\\2')", '2*x + 3*x')

“虚拟('2')*x + 虚拟('3')*x”

>>>评估(_)

2⋅x + 3⋅x

>>>乳胶(_)

'2x + 3x'

>>> import re

>>> re.sub("(^|[\(\[\{\+\-\*/ ,\:=])(\-?[0-9]*\.?[0-9]+)", "\\1Dummy('\\2')", '2*x + 3*x')

"Dummy('2')*x + Dummy('3')*x"

>>> eval(_)

2⋅x + 3⋅x

>>> latex(_)

'2 x + 3 x'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文