ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SymPy 打印指南:从 str、srepr 到 LaTeX、MathML 与 Graphviz 的完整输出体系

SymPy 打印指南:从 str、srepr 到 LaTeX、MathML 与 Graphviz 的完整输出体系 SymPy 打印指南从 str、srepr 到 LaTeX、MathML 与 Graphviz 的完整输出体系【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy一个用纯 Python 实现的计算机代数系统源码位于本仓库 sympy/在交互式会话中会默认使用 Unicode 字符对表达式进行美化输出。本文以官方入门教程 printing.rst 为骨架系统讲解 SymPy 中最常用的打印Printing能力如何用init_printing()与init_session()一键启用最适合当前环境的打印机以及如何手动调用str()、srepr()、pprint()/pretty()、latex()、print_mathml()与dotprint()等函数获取指定格式的输出。读完本文你将掌握 SymPy 表达式在不同环境IPython 终端、Notebook、普通 Python 会话与不同输出目标人类可读文本、Python 源码、论文排版、网页公式、依赖关系图之间的完整转换方案。一、SymPy 的打印机Printers体系概览SymPy 的打印子系统位于 sympy/printing/其模块入口 sympy/printing/init.py 集中导出了全部打印函数。官方教程列出的最常用打印机包括打印机输出形式典型使用场景str可读的 Python 风格字符串可直接复制粘贴回 Pythonprint(expr)、日常查看srepr精确还原表达式内部构造的规范字符串理解表达式内部结构、调试ASCII pretty printer纯 ASCII 字符拼出的二维数学排版不支持 Unicode 的终端Unicode pretty printer使用 Unicode 数学符号的二维排版现代终端、交互式会话默认输出LaTeX\int \sqrt{\frac{1}{x}}\, dx形式的 LaTeX 源码论文排版、IPython/Notebook 渲染MathML标准数学标记语言 XML网页数学内容、语义化交换DotGraphviz DOT 图语言可视化表达式的表达式树结构除上述打印机外SymPy 还内置了把表达式输出为代码的打印机例如 Cccode、Fortranfcode、Javascriptjscode、Juliajulia_code、Theano、Pythonpycode等它们同样由 sympy/printing/init.py 统一导出可用于代码生成codegen场景本文不展开讨论。二、一键启用最佳输出init_printing() 与 init_session()2.1 init_printing()自动选择当前环境可用的最佳打印机如果只是想获得最好的打印效果直接调用init_printing()即可它会自动探测环境并启用相应打印机 from sympy import init_printing init_printing() # doctest: SKIP其底层实现位于 sympy/interactive/printing.pyinit_printing函数。从源码可以看到它先根据pretty_print参数选定字符串化函数默认使用sympy.printing.pretty即美化打印机然后判断当前是否处于 IPython 会话分别走两条分支IPython 会话调用_init_ipython_printing为 IPython 的text/plain、image/png、image/svgxml、text/latex等 display formatter 注册 SymPy 专用的打印回调见 sympy/interactive/printing.py从而让Integral(sqrt(1/x), x)这样的表达式在单元格输出时直接呈现为渲染好的数学公式普通 Python 会话调用_init_python_printing通过替换sys.displayhook让交互式会话的每个非None返回值都走美化打印见 sympy/interactive/printing.py。2.2 init_session()一键启动完整的交互式计算环境如果你打算在计算器式的交互会话中工作init_session()会自动导入 SymPy 的全部内容、创建一些常用符号、配置绘图并顺带执行init_printing() from sympy import init_session init_session() # doctest: SKIP启动后会看到类似下面的提示Python console for SymPy 1.13.0 (Python 3.12.4-64-bit) (ground types: gmpy) These commands were executed: from sympy import * x, y, z, t symbols(x y z t) k, m, n symbols(k m n, integerTrue) f, g, h symbols(f g h, clsFunction) init_printing() # doctest: SKIP Documentation can be found at https://docs.sympy.org/1.13.0/ init_session的实现见 sympy/interactive/session.py其参数包括pretty_print是否使用美化打印、order项排序方式、use_unicode、use_latex、quiet是否静默启动、auto_symbols自动把标识符包装成符号、auto_int_to_Integer自动把1/2这样的整数字面量转为Rational(1, 2)等。2.3 不同环境下的实际表现调用init_printing()或init_session()后SymPy 会按如下优先级为你的环境选择打印机IPython QtConsole如果系统中安装了 LaTeX则启用基于 LaTeX 的打印表达式会被渲染为高质量的数学排版如果未安装 LaTeX 但安装了 Matplotlib则回退到 Matplotlib 的 mathtext 渲染引擎对应源码中的_print_latex_matplotlib见 sympy/interactive/printing.py如果连 Matplotlib 也没有则使用 Unicode 美化打印机。IPython Notebook使用 MathJax 将 LaTeX 源码渲染为网页公式IPython 控制台或普通 Python 会话只要终端支持 Unicode就使用 Unicode 美化打印机不支持 Unicode 的终端自动回退到 ASCII 美化打印机见 sympy/printing/pretty/pretty.py 中pprint_use_unicode/pprint_try_use_unicode的别名定义以及pretty_use_unicode()的环境探测逻辑。2.4 显式关闭 LaTeX 与 Unicode若想明确禁止 LaTeX 渲染向init_printing()或init_session()传入use_latexFalse若想明确禁用 Unicode 字符传入use_unicodeFalse init_printing(use_latexFalse) # 不渲染 LaTeX改用美化/纯文本 init_printing(use_unicodeFalse) # 强制使用 ASCII 字符从 init_printing 的签名 可以看到更多细节参数use_latex除了True/False/None之外还支持字符串取值png外部 LaTeX 编译器渲染失败回退 Matplotlib、matplotlib仅用 Matplotlib、mathjax输出 LaTeX 文本交由 MathJax 渲染、svg外部 LaTeX 编译器渲染 SVG无回退use_unicode为None时则由 sympy/interactive/printing.py 的源码逻辑按环境猜测。三、手动调用各打印函数除自动打印外你随时可以显式调用任一打印机对应的函数精确控制输出格式。3.1 str可复制粘贴的 Python 风格字符串使用str(expr)获取表达式的字符串形式它同时也是print(expr)的输出形式。字符串形式设计为可读性好且是合法的 Python 语法通常与输入表达式时长得一模一样可直接复制回 Python 执行 from sympy import * x, y, z symbols(x y z) str(Integral(sqrt(1/x), x)) Integral(sqrt(1/x), x) print(Integral(sqrt(1/x), x)) Integral(sqrt(1/x), x)3.2 srepr精确还原表达式内部构造srepr形式来自 sympy/printing/repr.py 模块由 sympy/printing/init.py 导出用于展示表达式的精确内部形式 srepr(Integral(sqrt(1/x), x)) Integral(Pow(Pow(Symbol(x), Integer(-1)), Rational(1, 2)), Tuple(Symbol(x)))可以看到sqrt(1/x)在内部被表示为Pow(Pow(Symbol(x), Integer(-1)), Rational(1, 2))——即(x^(-1))^(1/2)这对理解表达式如何由Symbol、Integer、Rational、Pow、Tuple等基本对象递归构造非常有帮助更深入的表达式操纵讨论见 manipulation.rst。一个值得注意的设计细节SymPy 刻意不使用Python 内置的repr()来做 repr 打印原因是 Python 的str(list)会对列表元素调用repr()而 SymPy 的部分函数会返回列表例如solve()。srepr输出极其冗长如果默认对solve()的返回结果调用没人会愿意看到满屏的Symbol、Integer嵌套。这一设计理由记录在教程的脚注中。3.3 ASCII 美化打印机pprint() 与 pretty()美化打印通过pprint()调用它在终端不支持 Unicode 时默认使用 ASCII 打印机否则需要显式传use_unicodeFalse pprint(Integral(sqrt(1/x), x), use_unicodeFalse) / | | ___ | / 1 | / - dx | \/ x | /pprint()把结果直接打印到屏幕如果需要字符串形式则使用pretty() pretty(Integral(sqrt(1/x), x), use_unicodeFalse) / \n | \n | ___ \n | / 1 \n | / - dx\n | \/ x \n | \n/ print(pretty(Integral(sqrt(1/x), x), use_unicodeFalse)) / | | ___ | / 1 | / - dx | \/ x | /源码层面pretty()创建PrettyPrinter实例并调用其doprint()见 sympy/printing/pretty/pretty.pypretty_print()/pprint()则是打印到终端的便捷封装见 sympy/printing/pretty/pretty.py。PrettyPrinter的默认设置见 sympy/printing/pretty/pretty.py还支持很多细节选项例如wrap_line默认True是否在行尾自动换行num_columns默认None换行前允许的列数None表示读取终端宽度root_notation默认True1/n次幂是否用根号形式输出设为False则用分数指数形式mat_symbol_style默认plain设为bold时矩阵符号以粗体数学字体打印imaginary_unit默认iUnicode 模式下虚数单位用i还是j。此外还有pager_print()见 sympy/printing/pretty/pretty.py它使用 pydoc 的分页器输出美化结果适合配合less -S这类支持横向滚动的分页工具查看超长表达式。3.4 Unicode 美化打印机Unicode 美化打印机同样通过pprint()和pretty()访问。终端支持 Unicode 时自动启用若pprint()未能检测到终端支持 Unicode可显式传use_unicodeTrue强制启用 pprint(Integral(sqrt(1/x), x), use_unicodeTrue) ⌠ ⎮ ___ ⎮ ╱ 1 ⎮ ╱ ─ dx ⎮ ╲╱ x ⌡积分号、根号、分式等都被替换为真正的 Unicode 数学符号可读性远优于 ASCII 版本。3.5 LaTeX 输出latex()使用latex()获取表达式的 LaTeX 形式 print(latex(Integral(sqrt(1/x), x))) \int \sqrt{\frac{1}{x}}\, dxlatex()函数定义于 sympy/printing/latex.py提供了非常丰富的格式选项其完整说明见该函数的文档字符串常用的包括参数作用mode输出边界方式可取plain默认无边界、inline$...$、equation/equation*equation环境equation*需导入amsmathfold_frac_powers分数次幂输出为^{p/q}而非^{\frac{p}{q}}fold_short_frac分母简单至多两项且无幂时用p / q代替\frac{p}{q}inv_trig_style反三角函数显示风格abbreviated、full或powerln_notation设为True时使用\ln而非默认的\logmat_delim矩阵包裹符[默认、(或mat_str矩阵环境字符串smallmatrixinline 默认、matrix、array等mul_symbol乘法符号None、ldot、dot、timesorder单项式排序lex、grlex、grevlex、old、none超长表达式提速可设nonesymbol_names把符号映射为自定义输出字符串的字典root_notation设为False时1/n次幂以分数指数形式输出full_prec设为True时浮点数按完整精度打印3.6 MathML 输出print_mathml() 与 mathml()SymPy 还提供 MathML 打印机print_mathml()需从sympy.printing.mathml导入 from sympy.printing.mathml import print_mathml print_mathml(Integral(sqrt(1/x), x)) apply int/ bvar cix/ci /bvar apply root/ apply power/ cix/ci cn-1/cn /apply /apply /applyprint_mathml()负责打印输出若想获得字符串则使用mathml()函数。MathML 由 sympy/printing/mathml.py 实现适合需要语义化数学标记如网页、文档交换的场景。3.7 Dot 输出dotprint() 与 Graphvizsympy/printing/dot.py 中的dotprint()函数把表达式输出为 DOT 格式可交由 Graphviz 渲染成表达式树图。下面是dotprint()的原始输出示例 from sympy.printing.dot import dotprint from sympy.abc import x print(dotprint(x2)) digraph{ # Graph style orderingout rankdirTD ######### # Nodes # ######### Add(Integer(2), Symbol(x))_() [colorblack, labelAdd, shapeellipse]; Integer(2)_(0,) [colorblack, label2, shapeellipse]; Symbol(x)_(1,) [colorblack, labelx, shapeellipse]; ######### # Edges # ######### Add(Integer(2), Symbol(x))_() - Integer(2)_(0,); Add(Integer(2), Symbol(x))_() - Symbol(x)_(1,); }输出清晰地展示了x 2的表达式树根节点Add有两个子节点Integer(2)与Symbol(x)。从 sympy/printing/dot.py 的源码可以看到节点的默认样式由default_styles定义Basic为蓝色椭圆、Expr为黑色而 purestr 函数生成的节点字符串遵循obj type(obj)(*obj.args)的构造方式eval后可以还原出原对象。将输出管道交给 Graphviz 的dot命令即可渲染为图形配合 manipulation.rst 中的示例是可视化理解 SymPy 表达式内部结构的有力工具。四、小结如何选择正确的打印方式日常交互使用直接调用init_printing()或init_session()开启完整环境让 SymPy 依据当前终端、IPython 形态以及 LaTeX/Matplotlib 的安装情况自动选择最佳打印机需要手工干预时用use_latexFalse、use_unicodeFalse关闭对应能力。程序内获取字符串str(expr)得到可读且可回填的 Python 代码srepr(expr)得到精确的内部构造描述适合调试与理解表达式结构。二维数学排版pprint(expr)打印、pretty(expr)取字符串通过use_unicode在 ASCII 与 Unicode 之间切换。排版与网页公式latex(expr)输出 LaTeX 源码可用mode、mul_symbol、mat_delim等参数微调print_mathml(expr)/mathml(expr)输出语义化 MathML。可视化表达式树dotprint(expr)生成 DOT 图配合 Graphviz 渲染。所有打印函数的源码实现与更完整的参数说明都可以在本仓库 sympy/printing/ 目录、sympy/interactive/printing.pyinit_printing以及 sympy/interactive/session.pyinit_session中进一步查阅。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表