Python 初體驗 - 好吃不黏牙!
這幾天上課的老師出了幾個需要畫圖的習題,大致上是要用常態分佈取樣幾個點,X 軸跟 Y 軸給不同的 mean 跟 standard deviation 繪製圖形。另外一個作業是繪出高斯分佈取樣的點的 probability density function。 剛開始還考慮用 perl 來解題,後來想說順便學一下 python,就試著用它來寫寫看。
跟 TimChen 要了些初學者用的網站,就開始看著 咬一口 python 程式語言這本線上書籍學 Python。看完幾頁之後,就發現 python 比想像中的好上手,程式碼也很簡潔。接下來就開始思考要如何解題。
第一個,我需要有高斯分佈的取樣點,馬上查了 “python gaussian distribution",有內建函式!很好很好,馬上就先解決取樣的問題。取樣完後需要 gnuplot 來畫圖。剛開始我打算先輸入到檔案裡面,再用 os module 來呼叫 gnuplot。在這個時候我又查了 “python gnuplot",沒想到又有!原來 python 有提供 gnuplot 的橋接,只要安裝 python-gnuplot 就可以使用了。所以這個問題就解決了,大約花了 30 行左右:
_#!/usr/bin/env python_
**import** random, os, Gnuplot
mean \= 3
strdev \= 10
ns \= \[10, 100, 1000, 10000\]
g \= Gnuplot.**Gnuplot**()
**g**('set multiplot')
**g**('set size 0.5,0.5')
**for** i **in** **range**(0, 4):
gauss \= **list**()
**for** j **in** **range**(0, ns\[i\]):
gauss.**append**(**list**())
gauss\[j\].**append**(random.**gauss**(mean, strdev))
gauss\[j\].**append**(random.**gauss**(mean, strdev))
**if** i \== 0:
**g**('set origin 0,0.5')
**elif** i \== 1:
**g**('set origin 0.5,0.5')
**elif** i \== 2:
**g**('set origin 0,0')
**else**:
**g**('set origin 0.5,0')
g.**plot**(gauss)
**g**('unset multiplot')
**raw\_input**('Please press return to continue...\\n')
Cool, 很好用。第二題要畫高斯分佈的 PDF,算這東西真的還蠻花時間的,後天就要交作業還是抱一下佛腳好了…。搜尋一下發現這東西,可以直接算出 PDF,當然又是直接拿來用…。
_#!/usr/bin/env python_
**import** statistics, random, Gnuplot
gauss \= **list**()
gauss2 \= **list**()
gpdf \= **list**()
gpdf2 \= **list**()
g \= Gnuplot.**Gnuplot**()
**for** i **in** **range**(0, 1000):
gauss.**append**(random.**gauss**(-2, 1))
gauss2.**append**(random.**gauss**(2, 2))
_#gauss.append(random.gauss(2, 1))_
_#gauss2.append(random.gauss(-2, 1))_
y, x \= statistics.**pdf**(gauss, kernel \= 'Gaussian')
w, z \= statistics.**pdf**(gauss2, kernel \= 'Gaussian')
**for** i **in** **range**(0, **len**(x)):
gpdf.**append**(**list**())
gpdf\[i\].**append**(x\[i\])
gpdf\[i\].**append**(y\[i\])
**for** i **in** **range**(0, **len**(w)):
gpdf2.**append**(**list**())
gpdf2\[i\].**append**(z\[i\])
gpdf2\[i\].**append**(w\[i\])
g.**plot**(gpdf, gpdf2)
**raw\_input**('Please press return to continue...\\n')
作業完成!
結論,Python 真的是好物阿!如果有寫其他程式語言的經驗,Python 是相當好學的東西!
讀者回函
讀完本文之後有什麼建議或回饋嗎?請按此在 Twitter 上面分享此文並且提及我,或是透過寄送電子郵件分享你的看法 😎