Data Science — Numpy Basic !
利用 Python 在進行數據整理或分析時,除了要會一般 Python 基礎語法外,需要學習其他 package,可以幫你在數據的處理上事半功倍,例如: Numpy, Pandas, Scipy, Matplotlib, Pymining 等 package。
今天主要介紹 Numpy 的基本應用,開啟數據分析第一步 ! 😃
在進行數據計算,我們必須使用大量的數學運算子以及講求運算的速度,這時候我們可以選擇 Numpy 。
Numpy 是 Python 進行科學計算的一個 package ,也可以稱作 “ Numeric Python ” ,用一種叫做 ndarray 的資料結構來進行運算。
開發環境
建議安裝 Anaconda,裡面已經包含數學、科學、工程 package (以下範例皆使用Python 3)。
import !
第一步當然是 import package 啊!
為了之後方便(少打字)使用,習慣取名為 np 。
建立陣列
- Single-dimensional Array
2. Multi-dimensional Array
( 詳細參閱: ndim( ), shape( ), size( ) )
不過我們很少是一個一個值輸入….
( 詳細參閱: zeros( ), ones( ), empty( ), full( ), linspace( ), eye( ), diag( ), random.randint( ), random.normal( ) )
讀/存擋
當然除了自己產生陣列以外,還可以讀/存檔案。
- 讀擋
假設有一個檔案 read.txt 內容是這樣:
Value1,Value2
0.2,0.1
0.4,0.4
0.1,0.6
0.1,0.3
0.6,0.3
使用 loadtxt( ) 來進行數據的讀擋。
由於不需要讀入 header ,我們使用 skiprows 來忽略第一行 delimiter=‘ , ’ ,代表我們的數據是利用 ‘ , ’ 當作數據跟數據間的分格符號( default=whitespace )
unpack=True,可以直接將 Value1, Value2 分別切出來, assign 給相對應的參數( default=False )。
但是,當我們欲要讀的檔案,裡面有 missing values 。
data2.csv
Value1,Value2
0.2,0.1
0.4,
0.1,0.6
0.1,0.3
,0.3
可以看到有缺失的資料 ( missing values ),如果使用 loadtxt( ) ,就會有 ValueError , loadtxt( ) 必須是在每一 row 都有相同數量的 value 下,才可以使用,如要進行讀擋,就要使用 genfromtxt( ) ,它可以針對 missing value 進行處理
可參考 genfromtxt( ) 官方文件,genfromtxt 比 loadtxt 有更多彈性的參數來幫助數據的讀取。
使用 genfromtxt( ) 、 loadtxt( ) 可將檔案裡的數據轉成 ndarray data type ,方便後面使用 Numpy 進行運算或是產生圖表(後面會提到)~
2. 存擋
可利用 savetxt( ) 來將一個 array 存進檔案裡面保存。
可另外參考比較:
save( ) : 將一個陣列存成 binary file( .npy
format)
savez( ) : 將多個陣列存成未壓縮的單一檔案( .npz
format)
savez_compressed( ) : 將多個陣列存成已壓縮的單一檔案( .npz
format)
單一資料型態
Numpy array 只可以存在一種資料型態,如果同時有數字以及布林值,就會都轉成數字,如果存在字串,就會全部轉成字串 所以可以歸納優先型態會是 字串>數字>布林 。
資料提取
跟List一樣,支援使用 index, slice, iterate 方式來提出陣列裡的資料 。
很特別的地方是,還可以使用判斷式來進行篩選:
( 詳細參閱 : where( ) )
改變結構
如果想要改變 ndarray 的結構 (shape),可以使用 reshape( ) 。
Example :
原本是2X3 array
[1 2 3]
[4 5 6]
想要改為3X2 array[1 2]
[3 4]
[5 6]
資料擴充與重複
Numpy 提供了幾個方法來讓數組擴展: append( )、insert( )、tile( )、repeat( ) 。
欲想將 [0 1] 變成 [0 1 0 1 0 1 0 1],這時可以使用 append( ) 或是 insert( )。
也可以使用 tile( ),它針對整個數組進行複製。
注意!以上並不等於 “ a+a+a “,這會變成三個陣列裡的數字相加,變成 [0 3] 。
如果想要使用 “ + ” 達到以上結果,就要改成使用Python List (將a指定為一般 Python List ,再使用 “ + ” ) 。
tile( ) 還有另外使用方法,如果想要創建 n-dim 的陣列,可以在第二 parameter 指定欲重複的 rows and columns 數量 。
但如果是想要將 [0 1] 變成 [0 0 1 1] ,則可使用 repeat( ) ,它可以針對數組中每一個元素,進行連續重複複製。
或是可以指定各個元素要重複的個數。
還有一個好用的地方,在 repeat( )第三個 parameter 加上 axis=0 / axis=1
它是指是要往哪個方向的維度擴展。
axis=0,是擴充 row ; axis=1 ,是擴充 column ,如下圖所示:
拷貝陣列
如果只是單純要複製某一個陣列,可直接使用 copy( ) ,可以複製出另一個陣列,且不會被原本陣列的改變而影響,佔用不同 memory 位置運用 may_share_memory( ) 確認是否兩個陣列使用同一個 memory block 。
刪除
有擴充當然有刪除囉~ Numpy 提供 delete( ) 。
畫圖表
這裡簡單介紹如何把陣列 show 在 Jupyter Notebook 上,方便我們了解數據的分佈情況,我們使用 Matplotlib package 。
打開 Notebook 後,輸入 “ %matplotlib inline ” ,它可以將 Matplotlib 的圖表直接嵌入到 Notebook 之中。
另外可以針對圖表的外觀進行設定且存成檔案。
了解了基本使用方法,就讓我們來做一下練習題吧 !
- 產生 [[0., 0., 0., 0., 0.], [2., 0., 0., 0., 0.], [0., 3., 0., 0., 0.], [0., 0., 4., 0., 0.], [0., 0., 0., 5., 0.], [0., 0., 0., 0., 6.]] 陣列
- 產生 [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 2], [1, 6, 1, 1]] 陣列
- 產生 [[4, 3, 4, 3, 4, 3], [2, 1, 2, 1, 2, 1], [4, 3, 4, 3, 4, 3], [2, 1, 2, 1, 2, 1]] 陣列
- 產生 [[0 0 0 0 0 0]
[0 0 0 0 0 0]
[0 0 0 0 0 0]
[0 0 0 0 0 0]
[1 0 0 0 0 0]
[0 2 0 0 0 0]] 陣列 - 產生 一個size大小為10的陣列,範圍從5~10之間(不包括5及10)
- 產生一個size大小為10且內容為random的陣列,並求其平均值、中位數、標準差 ( hint: random( ), mean( ), median( ), std( ) )
解答1:
解答2:
解答3:
解答4:
解答5:
解答6:
而在某些功能上,你會發現好像與 Python List 很相似,那為什麼要使用Numpy呢 😕
Python List vs Numpy
- element-wise計算
我們想要知道一個球隊隊員的bmi值:
以上執行,會出現此錯誤 “ TypeError: unsupported operand type(s) for ** or pow( ): ‘list’ and ‘int’ ” 。
如果使用Numpy就可以直接進行整個array的計算。
2. Memory
第二個例子,我們可以比較所佔用的memory。
很明顯的,使用Numpy比用List所佔用的memory還少 ~
3. 速度
以下例子是兩個 List/Numpy array 做相加,比較運算的速度。
以上例子可以看到, Numpy array 在運算上面比List還快,還可以發現Numpy 不需要使用 for ,就可以做到陣列間的運算,印證 Numpy 在運算上面的方便。
最後總結一下 Numpy 特點:
- 計算速度優,所佔 memory 較小
- 只能放單一型態
- 擁有 powerful 的 operations ,方便 n-dimensinal array 計算
- 針對科學計算來設計的 Packag
這篇主要介紹 Numpy 的基本運算,主要還有很多如線性代數的方法可以使用,可參考官方文件或是以下參考連結 !
參考
Python For Data Science Cheat Sheet
100 numpy exercises 可以來玩玩100個練習題!!
Python NumPy Tutorial — Introduction To NumPy With Examples
👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏