機器之心報導
編輯:小舟
你的代碼中有數學公式嗎?
數學是數據科學和機器學習的重要基礎,數學運算的結果對於機器學習項目而言是至關重要的。在編寫代碼時,我們常常需要定義數學公式的計算形式。像 S=r^2 這樣簡單的數學公式,大概不會出現拼寫錯誤。但如果是下面這樣的公式呢?
圖源:知乎用戶 @馬啃菠籮
還記得數學老師密密麻麻的板書嗎?人們習慣於手寫公式的運算過程。而如果計算機程式語言能夠顯示出類似於手寫公式的計算過程,檢查公式運算是否準確就可以輕鬆多了吧。
近日,GitHub 上一個名叫 handcalcs 的開源庫就解決了這個問題。
項目地址:https://github.com/connorferster/handcalcs
handcalcs 庫:將 Python 計算代碼轉換為 Latex 公式
handcalcs 庫可將 Python 計算代碼自動渲染為 Latex 公式,呈現方式類似於手寫的公式計算:先編寫符號公式,再代入具體數字,最後得出結果。
正如上面的演示樣例所示,計算機能夠識別的公式形式是:
而人們更習慣的是如下形式的數學公式:
handcalcs 的功能就是,將數學公式和運算過程以人們更容易理解的形式展示出來。
數學計算的結果往往會影響後續代碼的運行過程,而複雜的數學公式更容不得一點錯漏,因此對於包含較多複雜數學公式的 Python 代碼,用 handcalcs 進行自查或許是有必要的。
如何使用 handcalcs?
那麼,這個開源庫要如何應用呢?
基本用法 1:Jupyter 單元格魔法函數
handcalcs 的設計初衷是在 Jupyter Notebook 或 Jupyter Lab 中作為單元格魔法函數來使用。
首先,引入 handcalcs 模塊並運行單元格:
import handcalcs.render
接下來,在想要使用 handcalcs 的單元格上面添加一行魔法函數 %%render:
%%render
例如:
%%rendera = 2b = 3c = 2*a + b/3
如果系統安裝了 Latex 環境,你還可以將 notebook 導出成 pdf 格式文件。
基本用法 2:函數裝飾器 @handcalc()
除了在 Jupyter cell 中使用外,在 Python 的函數中也可以使用 handcalcs。
首先導入 @handcalc() 裝飾器:
from handcalcs.decorator import handcalc
然後編寫函數。注意:函數必須 return locals():
@handcalc()def my_calc(x, y, z): a = 2*x / y b = 3*a c = (a + b) / z return locals()
@handcalc(left: str = "", right: str = "", jupyter_display: bool = False)
返回一個由 (latex_code: str, locals: dict) 組成的元組,其中 locals 是函數命名空間範圍內所有變量的字典。
其他功能
有些公式的參數量較多,如果按照常規的格式顯示在一列,會浪費大量空間。而使用 handcalcs,只需添加注釋標籤# Parameters 就能讓參數以三列的形式顯示出來:
而有些公式的計算過程非常繁瑣,也會佔用大量顯示空間,只需使用標籤# Short 就能讓運算過程的顯示行數減少:
反之,如果你比較喜歡推導等式對齊的方式,可以使用# Long 標籤顯示。
有時你並不需要代入數值計算,只需要以符號的形式顯示數學計算公式。那麼,你需要使用# Symbolic 標籤:
handcalcs 的功能本身還可以解決編程中的小問題,即在 Python 中,顯示多個變量的值通常需要多個 print() 語句,而使用 handcalcs 能讓事情變得簡單許多:
很多開發者喜歡用_表示公式中的下標,handcalcs 可以將其顯示出來,甚至多級下標也可以通過嵌套的形式得到顯示。
數學公式中經常出現希臘字母(如「pi」、「eta」等),只要在代碼中編寫出對應的英文名,比如 alpha、beta,handcalcs 就可以顯示出希臘字母:
不只是簡單的數學公式,複雜公式也不在話下,比如含有積分的公式:
缺陷
雖然用處多多,但項目作者表示,handcalcs 仍存在一些小缺陷。
首先,handcalcs 並不適用於 collections 這種數據類型,例如 list、tuple、dict 等。
其次是在變量名方面,handcalcs 是針對 Jupyter 環境設計的。如果在 notebook 上重複使用變量名,則可能導致錯誤的數學運算。
handcalcs 雖然有些小瑕疵,但它對開發者而言頗有幫助。感興趣的話,快來動手試一下吧!