在jupyter notebook中美觀顯示矩陣

jupyter notebook直接集成mathjax(最近好像有點問題,總在右邊顯示一個秘制直線)。

另一方面,我們也可以讓代碼部分(其實是IPython的能力)控制它們的輸出,正如statsmodels輸出的美觀的回歸結果表格與PIL直接返回圖形。

這就是說IPython會截獲返回結果(ps:並存在_,__等變數里),並查看其類型決定如何輸出。同一類型有可能有很多種輸出方式,如它們起碼有__repr__的文本輸出。這時按一優先順序輸出。實際上對象模型中是輸出方式去持有類型映射的,像下面的代碼一樣:

from IPython.display import display,Latex,Math%matplotlib inlinefrom IPython.core.interactiveshell import InteractiveShellsh = InteractiveShell.instance()def number_to_str(n,cut=5): ns=str(n) format_={0:.+str(cut)+f} if e in ns or (. in ns and len(ns)>cut+1): return format_.format(n) else: return str(n)def matrix_to_latex(mat,style=bmatrix): if type(mat)==np.matrixlib.defmatrix.matrix: mat=mat.A head=regin{+style+} tail=rend{+style+} if len(mat.shape)==1: body=r\.join([str(el) for el in mat]) return head+body+tail elif len(mat.shape)==2: lines=[] for row in mat: lines.append(&.join([number_to_str(el) for el in row])+r\) s=head+ .join(lines)+tail return s return Nonesh.display_formatter.formatters[text/latex].type_printers[np.ndarray]=matrix_to_latex

此時輸入矩陣np.array([1,2,3]),IPython會按順序問各個格式化器它們有沒有這個類型(np.ndarray)的處理函數,如果有就捕捉並調用該函數,並將函數結果傳給格式化器內部的渲染函數(如果處理函數返回的不是None),如這裡處理函數就是將小數組轉換成latex表示矩陣的字元串返回。然後格式化器就會操縱IPython+mathjax渲染這個矩陣。

效果圖

我搞這個就是為了一些矩陣操作的演示,所以還有一個顯示矩陣分解的輔助函數

def show_decomposition(*args): latex= for arg in args: if type(arg)==str: latex+=arg else: latex+=matrix_to_latex(arg) latex=$+latex+$ display(Math(latex))

效果(矩陣的LR分解)

很酷,不是嗎
推薦閱讀:

【R圖秀】情人節快樂!
Tableau&BDP,哪個是最符合中國用戶使用習慣的數據可視化分析工具?
可視化 服裝3D結構設計(製版)
Matplotlib畫三維曲線
一張圖告訴你全球葡萄酒都產自哪些國家

TAG:Python | 可視化 | 科學計算 |