如何在 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 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
这给出:
更新 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 中正确渲染数学表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jupyter notebook (iPython) 中并排显示 2 张图像?
如何在 IPython Notebook 中编写 LaTeX?