elf*_*nor 5 python latex sympy pandas ipython-notebook
我正在使用 sympy 从几个表达式中收集术语,并希望在表格中格式化结果(在 ipython-notebook 中),术语位于最左侧的列中,随后的每一列代表一个表达式。该列中的条目来自dict返回的sympy.collect(syms, evaluate=False)
到目前为止,我有:
from IPython.display import display, Latex
import pandas as pd
import sympy as sym
sym.init_printing()
x,y,z = sym.symbols('x,y,z')
da,db,dc = sym.symbols('{\Delta}a {\Delta}b {\Delta}c ' )
e_list = []
d_list = []
e_list.append(da*2*x + da*(y - 2) + db*3*z + dc*(x+y))
e_list.append(dc*z + dc*x + da*x + db*(z+2))
for e in e_list:
display(e.expand().collect((x,y,z)))
d_list.append(e.expand().collect((x,y,z),evaluate=False))
df = pd.DataFrame(d_list).T
Run Code Online (Sandbox Code Playgroud)
数据框显示为我想要的,除了条目是原始乳胶。
我认为以下方法可行:
Latex(df.to_latex())
Run Code Online (Sandbox Code Playgroud)
但我得到的只是一个盒子包围的乳胶代码。
编辑:这似乎是 ipython 和 Latex 表的一个已知问题,请参见此处:
我有两种不同的解决方法。使用单码:
sym.init_printing(use_latex=False)
...
da,db,dc = sym.symbols('?a ?b ?c' )
Run Code Online (Sandbox Code Playgroud)
或将表格显示为 sympy 矩阵:
terms = [x,y,z]
d_list = [(e.expand().collect((terms),evaluate=False)) for e in e_list]
mterms = sym.zeros(M.shape[0],len(terms)+1)
key1 = d_list[0].keys()[0]
terms.insert(0,key1)
for i in range(mterms.shape[0]):
for j in range(mterms.shape[1]):
try:
mterms[i,j] = d_list[i][terms[j]]
except:
mterms[i,j] = 0
mterms
Run Code Online (Sandbox Code Playgroud)
毫无疑问,部分问题在于您得到的乳胶df.to_latex()实际上并不是有效的乳胶。例如,如果您只是获取该函数的输出并将其粘贴到专用的乳胶文档中,它将无法编译。
特别是,表中的某些条目包含诸如 之类的内容\Delta,但这些内容超出了数学环境(没有美元符号)。
所以这绝对是一个问题。另一个可能的问题是使用\toprule等。这些是非标准乳胶结构(尽管它们可以与正确的乳胶包一起使用),但我不知道这些rules 是否被函数识别Latex。
尽管如此,我什至无法让最简单的tabular环境正确显示。例如,即使我这样做
Latex(r"""\begin{tabular}{l} 1 \\ 2 \end{tabular}""")
Run Code Online (Sandbox Code Playgroud)
正如你所说,我得到了一个盒装结果。(尽管该字符串的内容确实可以在专用乳胶文档中正确编译。)
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |