如何在 IPython Notebook 中正确渲染数学表

Posted

技术标签:

【中文标题】如何在 IPython Notebook 中正确渲染数学表【英文标题】:How to Render Math Table Properly in IPython Notebook 【发布时间】:2014-02-13 03:29:26 【问题描述】:

我正在解决的数学问题在不同的情况下给出了不同的分析解决方案,我想将结果总结在一张漂亮的表格中。 IPython Notebook 很好地呈现了列表: 例如:

import sympy
from pandas import DataFrame
from sympy import *
init_printing()
a, b, c, d = symbols('a b c d')
t = [[a/b, b/a], [c/d, d/c]]
t

但是,当我使用 DataFrame 将答案汇总到表格中时,无法再呈现数学:

df = DataFrame(t, index=['Situation 1', 'Situation 2'], columns=['Answer1','Answer2'])
df

"print df.to_latex()" 也给出相同的结果。我也尝试过“print(latex(t))”,但它在 LaTex 中编译后给出了这个,这没关系,但我仍然需要手动将其转换为表格:

我应该如何正确使用 DataFrame 才能正确呈现数学?或者有没有其他方法可以将数学结果导出到 Latex 中的表格中?谢谢!

更新:2014 年 1 月 25 日 再次感谢@Jakob 解决了这个问题。它非常适用于简单的矩阵,尽管对于更复杂的数学表达式仍有一些小问题。但我想就像@asmeurer 所说,完美需要更新 IPython 和 Pandas。

更新:2014 年 1 月 26 日 如果我直接渲染结果,即只打印列表,它工作正常:

【问题讨论】:

This 可能有用。 谢谢,@TomAugspurger。我将他们的“df”中的一个值更改为“a/b”,但最终表格输出仍然无法很好地呈现数学。 我认为这是 ***.com/questions/18503351/… 的副本(所以我不会将其标记为这样,因为它无法在重复对话框中找到它) 特别是看到我对这个问题的评论。如果不改进 IPython 和/或 pandas,我认为这是不可能的。 可以试试直接渲染复杂的表达式吗?在这里,您更有可能达到 MathJax 的可能性,而 IPython、sympy 或 pandas 的更新将无法解决您的问题。 【参考方案1】:

MathJax 目前无法渲染表格,因此最明显的方法(纯乳胶)不起作用。

但是,遵循@asmeurer 的建议,您应该使用 html 表格并将单元格内容呈现为乳胶。在您的情况下,这可以通过以下中间步骤轻松实现:

from sympy import latex
tl = map(lambda tc: '$'+latex(tc)+'$',t)
df = DataFrame(tl, index=['Situation 1', 'Situation 2'], columns=['Answer'])
df

给出:


更新:

在二维数据的情况下,简单的地图功能将无法直接工作。为了应对这种情况,numpy shapereshaperavel 函数可以像这样使用:

import numpy as np
t = [[a/b, b/a],[a*a,b*b]]
tl=np.reshape(map(lambda tc: '$'+latex(tc)+'$',np.ravel(t)),np.shape(t))
df = DataFrame(tl, index=['Situation 1', 'Situation 2'], columns=['Answer 1','Answer 2'])
df

这给出:


更新 2:

如果字符串长度超过某个数字,Pandas 会裁剪单元格内容。例如更复杂的表达式,如

t1 = [a/2+b/2+c/2+d/2]
tl=np.reshape(map(lambda tc: '$'+latex(tc)+'$',np.ravel(t1)),np.shape(t1))
df = DataFrame(tl, index=['Situation 1'], columns=['Answer 1'])
df

给:

为了解决这个问题,必须更改 pandas 包选项,详情请参阅here。对于目前的情况,max_colwidth 必须更改。默认值为 50,因此我们将其更改为 100:

import pandas as pd
pd.options.display.max_colwidth=100
df

给:

【讨论】:

谢谢,@Jakob。它适用于上面的示例,但是当值大于一维时,它会给我错误ValueError: Shape of passed values is (1, 2), indices imply (2, 2) 只是快速猜测一下,您是否指定了第二个列标题?如果我省略第二列标题,我会得到这个错误。或者您能否更具体地说明您要显示的数据类型。 致@Jakob:我确实包含了第二列标题,请参阅相关代码:columns=['Answer1','Answer2']。我试图显示的数据类型是一堆数学方程(使用 SymPy),它们是一些经济优化问题的解析解。 @Titanic 我已经更新了处理二维数据的答案。奇怪我没有遇到你的问题!? 非常感谢,@Jakob。我不知道我需要为二维数据添加np.ravel(t)),np.shape(t)。我会查找更多解释。谢谢!

以上是关于如何在 IPython Notebook 中正确渲染数学表的主要内容,如果未能解决你的问题,请参考以下文章

如何安装ipython notebook

如何在 Jupyter notebook (iPython) 中并排显示 2 张图像?

如何在 IPython Notebook 中编写 LaTeX?

如何在win7 64下安装ipython notebook

iPython/Jupyter Notebook 和 Pandas,如何在 for 循环中绘制多个图?

如何在 IPython Notebook Server 3 中查看函数参数?