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

时间:2014-01-22 20:49:51

标签: pandas latex ipython ipython-notebook sympy

我正在解决的数学问题在不同的场景中提供了不同的分析解决方案,我想在一个很好的表格中总结结果。 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

enter image description here

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

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

enter image description here

“print df.to_latex()”也给出了相同的结果。我也尝试过“print(latex(t))”,但是在LaTex中编译完成后就可以了,这很好,但是我仍然需要手动将它转换成表格:

enter image description here

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

更新:2014年1月25日 再次感谢@Jakob解决问题。它适用于简单矩阵,但对于更复杂的数学表达式仍然存在一些小问题。但我想@asmeurer说,完美需要IPython和Pandas的更新。

enter image description here

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

1 个答案:

答案 0 :(得分:5)

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

但是,按照@asmeurer的建议,您应该使用html表并将单元格内容渲染为latex。在您的情况下,可以通过以下中间步骤轻松实现:

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

给出:
enter image description here


<强>更新

如果是二维数据,简单的地图功能将无法直接使用。为了应对这种情况,可以使用numpy shape reshape ravel 函数,如:

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

这给出了:
enter image description here


更新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

给出:
enter image description here

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

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

给出:
enter image description here