剛開始學習Python做數據資料分析的人可能多少會聽到NumPy這個Libray。如果你不確定NumPy到底是做什麼的,希望這一篇文章可以提供一些參考 🙂。
先說,今天我們不會著重在NumPy的各種功能(What),而比較是在於為什麼(Why)用 NumPy 喔。
首先,NumPy的原意是Numerical Python。
正如其名,它被製造出來專門為Python處理數字類的計算及運用。當然,如果只是單一數字間的運算,那純Python就做得到了,為何需要什麼NumPy?
其實,NumPy真正的目的,是幫助我們做高效能的array(陣列)運算。
所謂的array,暫時我們就簡單把它當成Python的List,它就是像一個容器可儲存一系列的元素(這裡暫先不討論list跟array定義上或技術上的差別)。
舉個例子好了:
政府今天想要發防疫補助金給每一個店家,基於公平原則(?)每一家都發一樣的錢。
算法是以所有店家的平均營業額,乘上0.2,算出來的數字來發給每個店家。
之後,看看每家的營業額加上補助金之後會變多少。
下面簡單的用六家店來做例子,各個營業額分別為32,30,25,36,50,40。
如果我們用純Python來做這些計算,不借助其他模組的話,也許會用到一些For Loop吧(可以自己試著做做看~😉)。
但是利用NumPy,我們可以不需要寫任何Loop就可以做到喔!
看看下面的例子:
怎麼樣?看起來是不是相當清爽?式子中沒有用到任何一個For Loop就達到了我們的目的!
ndarray物件
接下來,我們來稍微談一下NumPy是如何做出這些事的。
看到上面的例子,numpy.array這個函數會創造出一個物件叫做ndarray:指的是n維度陣列(N-dimensional array)。
名字有點饒舌,沒關係,重點是這個ndarray就是NumPy的核心構造。如上面的例子,透過將List轉換成ndarray的物件,我們入手許多強力的工具。
包括先前看到的mean,其他還有sum, max, min, std等基本計算函數都可以使用。
嗯,這些都不錯,但是我們要提一下的是ndarray的幾個重要的特性:
Vectorization
又稱為vectorized operation。簡單來說就是以array為單位來做計算(相較於以單一數據為單位的迴圈計算),前提是array中每一個元素必須是相同的type(你可以用ndarray.dtype來檢驗),執行上numpy利用C語言來優化這個過程,詳細可參考這裡。
特色就是不用你寫for loops而且計算速度很快。
到底多快?我們稍微做一個測試:
上圖的例子中,我們單純對一百萬筆的每個數值加上2。可以看到,利用Python的List Comprehension實際測出的平均速度為71.7ms(約0.072秒),而利用NumPy則是來到了1.46ms(約0.001秒)。
好棒棒對不對 👏。
Shape
Shape是ndarray的另一個重要特徵。
之前有提過ndarray的nd指的是n維度(dimension)。可想而知,有一維,二維,三維...等等。
我們可以利用.shape這個attribute來看出一個ndarray的形狀。
.shape會給你一個tuple告訴你array的形狀。tuple的element的數量(length)代表他有幾個維度。
你可以利用.reshape去做形狀的重塑:
這邊我們將原來的一維度array變成了二維度,2乘3的形狀(2 rows, 3 columns)。
所以我們在意這些形狀到底是為了什麼呢?
簡單來說,當我們要做array跟array之間的運算時,必須要確認的一點,就是形狀得符合。
譬如下圖,兩個形狀相同的array,NumPy知道如何把它 " + " 加起來。
但是今天如果形狀不OK,就沒那麼順利了...
關於array的Shape之間的互容性及計算規則,如果想要更深入理解的話,可以參考這裡。
小結
今天將NumPy做了一個快速的介紹。基本上我們利用NumPy就是因為:
方便做array的計算(再說一次,不用寫for loop喔💖)
效能極高
當然NumPy還有許多重要的功能,包括如何去做定位跟切割(Indexing & Slicing),資料篩選(Filtering),還有許多小幫手功能來幫助我們生成ndarray。避免篇幅過長,我們下次再介紹囉。
NumPy主要是用低階語言C所寫出來的,效能很強,絕對比我們自己用For loop寫跑的更快更有效率,因此在處理龐大的資料時是非常受到青睞的工具。
知名的Pandas,也是以NumPy為基礎建立出來的。如果你已經在用Pandas的話,理解NumPy可以更幫助我們的學習及實作喔~😀
Commentaires