如何在 IPython Notebook 中使用 SymPy 进行漂亮的打印输出?

61

我尝试了pprintprint,前者只打印Unicode版本,而后者不会进行美观的打印。

from sympy import symbols, Function
import sympy.functions as sym
from sympy import init_printing
init_printing(use_latex=True)
from sympy import pprint
from sympy import Symbol

x = Symbol('x')

# If a cell contains only the following, it will render perfectly.
(pi + x)**2

# However I would like to control what to print in a function, 
# so that multiple expressions can be printed from a single notebook cell.
pprint((pi + x)**2)
4个回答

88

你需要使用display:

from IPython.display import display

display(yourobject)

它将选择适当的表示形式(文本/LaTex/png...),在IPython的更新版本中(6.0+),显示是默认导入的,但我们仍然建议明确地导入它。


7
需要指出的是,为了使SymPy对象能够在LaTeX中正确显示,您仍需要调用init_printing函数进行初始化。 - asmeurer
有没有办法限制输出的宽度?我尝试使用 display(expr, width=1000),但没有成功。 - mmj

34
问题在于你的init_printing语句。在笔记本中,你不应该运行latex,而是应该使用mathjax,所以请尝试使用以下语句:

问题出在 init_printing 语句上。在笔记本中,你不需要运行 LaTeX,而应使用 MathJax,因此请改用以下语句:

init_printing(use_latex='mathjax')

当我使用这个功能时,无论何时在单元格的最后一行放置一个sympy表达式,都能够得到正常的漂亮打印效果。


为什么你不想在笔记本中运行latex呢? 这个建议对我来说打印了Unicode漂亮的打印。您使用的ipython和sympy版本是什么?可能与https://dev59.com/o47da4cB1Zd3GeqP8heA提到的问题有关。 - Løiten

15

我曾经提出类似的问题(现在已经与这个问题链接在一起)。 阅读了答案并进行了一些调整后,我得出结论,可以获得3种类型的输出:

  1. "不够美观",纯文本... "低质量"。 使用print(expression)获得此类型的输出。

  2. 漂亮的,纯文本... "中等质量"。 使用

     import sympy as sym
     sympy.pprint(expression)
    
    它仍然使用相同的字体,只使用字符来组合数学表达式。但它可以举例来说,提高数字的幂,通过排列水平线来拉分数等等。
    1. 美观,带有图形、符号等... “高质量”。 这就是人们通过使用获得的内容

     import IPython.display as disp
     disp.display(expression)
    

这与笔记本单元格的输出相同,但现在是通过命令得到的结果。 然后,一个单一的笔记本单元格可以有多个此类输出。

值得注意的是:

  1. sym.init_printing(... 影响 sym.pprint 的输出。

  2. sym.latex(expression) 为表达式生成 LaTeX 字符串。 disp.Math(... 从 LaTeX 生成表达式。 这两个可能会有用。 因此,disp.display(disp.Math(sym.latex(expression))) 会产生与 disp.display(expression) 相同的输出。


1
我很感激您对可能性及其差异进行深入的审查。这比仅仅说“使用x方法”要好得多,因为它没有解释方法的内部细节。对于那些使用Jupyter笔记本的人来说,display将在不导入任何内容的情况下可用,并且可以直接像这样使用:display(expression) - mins

9

这个有效。

from IPython.display import display, Latex
from sympy import *

x = symbols('x')
display(x)

int_x = Integral(cos(x)*exp(x), x)
result = "$${} = {}$$".format(latex(int_x), latex(int_x.doit()))
display(Latex(result))

derv_x = Derivative(cos(x)*exp(x), x)
result = "$${} = {}$$".format(latex(derv_x), latex(derv_x.doit()))
display(Latex(result))

你可以自己尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接