2014-01-22 38 views
9

我正在求解的數學問題在不同的場景中給出了不同的分析解決方案,我想在一個不錯的表中總結結果。 IPython的筆記本呈現列表很好: 例如:如何在IPython筆記本中正確呈現數學表

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

然而,當我總結使用數據框的答案到一個表,算算不能呈現任何更多:

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

enter image description here

「print df.to_latex()」也給出了相同的結果。我也試過「打印(乳膠(T))」,但它在乳膠,這是正常的編譯後給出了這樣的,但我仍然需要手動將其轉換爲一個表:

enter image description here

我應該如何使用DataFrame正確地爲了正確渲染數學?或者有沒有其他方法可以將數學結果導出到Latex中的表中?謝謝!

更新:01/25/14 再次感謝@Jakob解決問題。它適用於簡單的矩陣,但對於更復雜的數學表達式仍然存在一些小問題。但我想@asmeurer說,完美需要IPython和Pandas的更新。

enter image description here

更新:14年1月26日 如果我直接呈現的結果,即只打印列表,它工作正常: enter image description here

+0

[這](https://github.com/pydata/pandas/pull/5763)可能是有用。 – TomAugspurger

+0

謝謝@TomAugspurger。我將其'df'中的一個值更改爲'a/b',但最終的表格輸出仍然無法很好地表達數學。 – Titanic

+0

我認爲這是http://stackoverflow.com/questions/18503351/how-to-get-a-latex-table-of-sympy-expressions-in-ipython-notebook的重複(所以不會讓我將其標記爲這樣,因爲它無法在複製對話框中找到它) – asmeurer

回答

4

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 

其給出:在你的情況下,這可能是由於以下中間步驟可以容易地實現
enter image description here


更新:

在二維數據的情況下,該簡單的地圖功能不會直接工作。爲了應對這種情況,numpy的形狀重塑拉威爾功能可以使用,如:

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:

熊貓作物如果字符串長度超過一定數量,則爲單元格內容。 E.g更復雜的語句,比如

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

爲了解決這個問題,一個熊貓封裝選項已被改變,詳見here。對於目前的情況,max_colwidth必須改變。默認值是50,因此讓我們將其改爲100:

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

給出:
enter image description here

+0

謝謝,@Jakob。它適用於上面的例子,但是當值超過一維時,它會給我錯誤「ValueError:傳遞值的形狀是(1,2),索引是(2,2)'。 – Titanic

+0

只是一個猜測,你有沒有指定第二列的標題?如果我省略第二列標題,我會得到這個錯誤。或者,您可以更具體地說明您嘗試顯示的數據類型。 – Jakob

+0

對@Jakob:我確實包括了第二列標題,請參閱有問題的代碼:'columns = ['Answer1','Answer2']'。我試圖展示的數據類型是一堆數學方程(使用SymPy),它們是一些經濟優化問題的分析解決方案。 – Titanic