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

10

我正在解决的数学问题在不同情境下给出不同的解析解,我希望能够用一张漂亮的表格来总结结果。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

输入图像描述

"print df.to_latex()"也会得到相同的结果。我还尝试了"print(latex(t))",但在LaTex编译后它会给出这个,这是可以的,但我仍然需要手动将其转换为表格:

输入图像描述

我应该如何正确使用DataFrame以便正确呈现数学公式?或者还有其他方法将数学结果导出为LaTeX表格吗?谢谢!

更新:01/25/14 再次感谢@Jakob解决问题。对于简单矩阵,它完美地工作,尽管对于更复杂的数学表达式仍存在一些小问题。但我想像@asmeurer所说的那样,完美需要IPython和Pandas的更新。

输入图像描述

更新:01/26/14 如果直接呈现结果,即只打印列表,它可以正常工作: 输入图像描述


这可能很有用。 - TomAugspurger
我认为这是 https://dev59.com/dHbZa4cB1Zd3GeqPDTzu 的重复(因为它在重复对话框中无法找到,所以SO不允许我将其标记为重复)。 - asmeurer
尤其是请查看我在那个问题上的评论。我认为这是不可能实现的,除非改进IPython和/或pandas。 - asmeurer
你能否尝试直接渲染这些复杂的表达式吗?更有可能的是,您需要利用MathJax的功能,而IPython、sympy或pandas的更新并不能解决您的问题。 - Jakob
经过一番搜索,我找到了解决您问题的方法!请看下面我的更新。 - Jakob
显示剩余3条评论
1个回答

6

MathJax目前无法渲染表格,因此最显而易见的方法(纯LaTeX)不起作用。

但是,遵循@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中的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

这将提供以下内容:
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包的一个选项,请参见此处获取详细信息。对于当前情况,必须更改max_colwidth。默认值为50,因此让我们将其更改为100:
import pandas as pd
pd.options.display.max_colwidth=100
df

给出:
这是一个图片描述
(该图片为IT技术相关内容,无法直接翻译)

谢谢,@Jakob。对于上面的例子它是有效的,但当值超过一维时,它会给我一个错误 ValueError: Shape of passed values is (1, 2), indices imply (2, 2) - Titanic
只是一个猜测,您是否指定了第二列标题?如果我省略第二列标题,我会得到完全相同的错误。或者您能否更具体地说明您正在尝试显示的数据类型。 - Jakob
给@Jakob:我确实包含了第二列标题,请查看以下代码:columns=['Answer1','Answer2']。我试图展示的数据类型是一堆数学方程(使用SymPy),这些方程是某个经济优化问题的分析解决方案。 - Titanic
@Titanic 我已更新我的答案以处理2D数据。奇怪的是我没有遇到你的问题!? - Jakob
非常感谢,@Jakob。我不知道需要为二维数据添加np.ravel(t)), np.shape(t)。我会查阅更多的解释,感谢! - Titanic
太好了,它运行正常!只是一个快速的评论,原始的map函数将2D数据转换为1D数据(sympy.latex与列表很好地配合),因此需要单独处理每个单元格-> ravel将2D数组重塑为1D,随后的reshape再次构建2D版本。 - Jakob

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