Data Science — Numpy Basic !

cch
PyLadies Taiwan
Published in
8 min readDec 3, 2017

利用 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 。

建立陣列

  1. Single-dimensional Array

2. Multi-dimensional Array

( 詳細參閱: ndim( ), shape( ), size( ) )

不過我們很少是一個一個值輸入….

( 詳細參閱: zeros( ), ones( ), empty( ), full( ), linspace( ), eye( ), diag( ), random.randint( ), random.normal( ) )

讀/存擋

當然除了自己產生陣列以外,還可以讀/存檔案。

  1. 讀擋

假設有一個檔案 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 之中。

另外可以針對圖表的外觀進行設定且存成檔案。

了解了基本使用方法,就讓我們來做一下練習題吧 !

  1. 產生 [[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.]] 陣列
  2. 產生 [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 2], [1, 6, 1, 1]] 陣列
  3. 產生 [[4, 3, 4, 3, 4, 3], [2, 1, 2, 1, 2, 1], [4, 3, 4, 3, 4, 3], [2, 1, 2, 1, 2, 1]] 陣列
  4. 產生 [[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]] 陣列
  5. 產生 一個size大小為10的陣列,範圍從5~10之間(不包括5及10)
  6. 產生一個size大小為10且內容為random的陣列,並求其平均值、中位數、標準差 ( hint: random( ), mean( ), median( ), std( ) )

解答1:

解答2:

解答3:

解答4:

解答5:

解答6:

而在某些功能上,你會發現好像與 Python List 很相似,那為什麼要使用Numpy呢 😕

Python List vs Numpy

  1. 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

👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏

--

--