數據分析基本工具-NumPy

Yasmine Cheng
數據領航員
Published in
10 min readMar 10, 2022

目錄

前言
介紹NumPy
語法說明
總結
參考資料

前言

在數據分析的領域中,我們常使用到的工具包含SQL、SPSS、Python等程式語言,而接下來的整個系列裡,數據領航員會以Python的角度帶大家切入主題作探討。

Python是個非常易理解與學習的語言(不過本主題不會做太多的介紹…),其中很大的一個優點是有非常多的第三方套件,可幫助開發者提升專案開發效率(可參考:https://pypi.org/)。

至於在資料科學的專案中,我們時常使用到的套件模組是Seaborn、Pandas、Matplotlib等,往後的文章中也會陸續再向讀者做介紹,本篇文章會將重點鎖定於Numpy!使用到的程式碼也會放在Github上,歡迎取用~

介紹NumPy

NumPy(Numerical Python),是高性能計算和資料分析的基本套件,包含6大特色:提供高效能的N維度陣列運算、具備全面的數學運算功能、許多的硬體和運算平台皆可搭配使用、入門門檻低且操作直觀、可與其他程式語言做整合(EX:C、C++等)、為Open Source可公開開發和維護的。(可參考:https://numpy.org/)

證明NumPy具有高效能?

以下段落帶大家了解list及ndarray的資料型態差別。

首先,是運算效能上的差異。上方的程式碼圖片是將list(a)資料型態及ndarray(b)的資料型態同做相同的運算(先創建資料長度為100000000的list及ndarray,並各自將資料內容加總),可發現list的運算效率遠為ndarray的將近八倍,list所花費的時間約為570ms,而ndarray只花了約為74ms的時間。

機器學習或是深度學習最大的特點就是會進行複雜且大量的運算,因此不論資料的大小及維度,ndarray都可以為我們省去許多不必要的等待時間或是機器上的效能問題。

另外,ndarray 除了運算效能比 list 快上很多之外,其實是有一個限制的,而這也是 list 的優勢。就是儲存在同一個 ndarray 裡的資料都要是同樣的資料型別。反之,list則不需要。

語法說明

安裝套件

###為指令介面語法
conda install numpy #使用conda環境安裝
pip install numpy #使用pip原生方式安裝

引入套件

import numpy as np                #引入套件

查看資訊

參考自 http://taewan.kim/post/numpy_cheat_sheet/
print(ndarray.ndim)               #顯示維度
print(ndarray.shape) #顯示形狀
print(ndarray.dtype) #顯示資料型態
print(ndarray.size) #顯示元素總數

建立陣列

np.array([1, 2, 3])               #建立一維陣列(指定元素內容)
np.array([1, 2, 3], [4, 5, 6]) #建立二維陣列(指定元素內容)
np.arange(1, 10, 2) #建立1~10(不包含10),間隔為2的陣列,跟range()的概念一樣
np.linspace(0,4,5) #建立元素總數為5的0~4等差數列的陣列
np.repeat([1, 2], 2) #建立陣列元素個別連續重複的新陣列
np.tile([1, 2], 2) #建立陣列連續重複的新陣列
np.zeros((2, 3)) #建立全部元素皆為0的陣列
np.ones((2, 3)) #建立全部元素皆為1的陣列
np.ones((2, 3))*5 #建立全部元素皆為5的陣列
np.full((2,3), 5, dtype=float) #建立全部元素皆為5的陣列(資料型態指定為浮點數,其他支援的資料型態如下圖所示)
np.identity(3) #建立單元矩陣
np.eye(4,3) #建立對角線為1的矩陣
np.random.random(3) #建立0~1間亂數的一維矩陣
np.random.randn(3) #建立0~1間標準正態分布的一維矩陣
np.random.normal(loc=0, scale=1, size=3)
#建立平均值0、標準差1的正態分布一維矩陣(3個元素)

以下圖表為ndarray所支持的所有資料型態整理表。

參考自https://medium.com/python4u/hello-numpy-b5ebe67a1ada

陣列的索引、維度轉換及排序

np.arange(1, 10).reshape(3, 3)    #建立1~10(不包含10),間隔為1的陣列,並轉成3X3的矩陣
ndarray[:, 1] #選取矩陣中的某一列(第1列)
ndarray[:, [0,1]] #選取矩陣中的多列(第0、1列)
ndarray[1, :] #選取矩陣中的某一行(第1行)
ndarray[[0,1], :] #選取矩陣中的多行(第0、1行)
ndarray[0, 0] #選取矩陣中的某個元素(第0列 第0行)
ndarray[ndarray[:]>3] #設定單一條件(大於3的所有元素)
ndarray[(ndarray[:]>3) & (ndarray[:]<6)]
#設定多種條件(大於3且小於6的所有元素),可用且&及或|設立
ndarray.T #將矩陣轉置
np.transpose(ndarray) #將矩陣轉置
ndarray.flatten() #將矩陣平鋪展開(傳回的是拷貝的資料,因此若修改的話不會影響到原先的矩陣)
ndarray.ravel() #將矩陣平鋪展開(傳回的是原始的資料,因此若修改的話會影響到原先的矩陣!)
np.sort(ndarray) #將矩陣排序(default為升冪)
np.argsort(ndarray) #將陣列排序後,回傳排序好的index索引。(default為升冪排列)

陣列的合併

### 以A、B代表欲合併的兩陣列
np.append(A, B, axis=0) #垂直合併
np.concatenate((A, B), axis=0) #垂直合併
np.vstack((A, B)) #垂直合併
np.append(A, B, axis=1) #水平合併
np.concatenate((A, B), axis=1) #水平合併
np.hstack((A, B)) #水平合併

運算及統計

### 以X、Y代表目標的兩陣列
X+Y #加法
X-Y #減法
X*Y #乘法
X/Y #除法
np.dot(X, Y) #內積
np.cross(X, Y) #外積
np.mean(ndarray) #平均數、加權平均數
np.average(ndarray) #平均數、加權平均數
np.var(ndarray) #變異數
np.std(ndarray) #標準差
np.min(ndarray) #最小值
np.argmin(ndarray) #最小值的索引
np.max(ndarray) #最大值
np.argmax(ndarray) #最大值的索引
np.ptp(ndarray) #全距
np.percentile(ndarray, 50) #百分位距(50分位)
np.median(ndarray) #中位數
np.sum(ndarray) #加總

💡因 np.dot() 的用法筆者認為較為特殊,特別拉出來和大家做介紹~

矩陣運算方式

若兩矩陣(x, y)需進行內積運算,x為m×n階矩陣,y就必須為n×p階矩陣,算出的結果則會為m×p階矩陣,不符合此規定的話則無法運算。

參考自https://mathinsight.org/matrix_vector_multiplication

如上圖所示,A矩陣為2×3階矩陣,B為3×2階矩陣,因此算出的結果為2×2階矩陣。

上圖的程式碼中,x與y矩陣同樣都為2×3階矩陣,因此不符合規定,無法做運算則報錯。

特殊情況

array([1, 2, 3]) 看似是1×3階的矩陣,但其實他的shape卻是(3, )

因此若x矩陣為3×3階矩陣,y為3×?階矩陣,是可以做運算的。

反之,若x矩陣為3×1階矩陣,y為3×?階矩陣,也一樣會報錯無法做運算。

根據上述所論,若讀者想要的shape是1×3矩陣的話,比較安全的打法會是array([[1, 2, 3]])

不過,若將上述的情況顛倒過來,np.dot()又會自動先轉置後再做運算。例如:x為3×?階矩陣,y矩陣為3×1階矩陣。直觀想法應該要報錯,但np.dot()先將x矩陣轉換了,可以想像成x是?×3階而y仍然是3×1階,因此還是可以做運算。

以上為np.dot() 中較容易搞混的內容,透過補充的方式帶大家釐清。

教育部補助大專院校STEM領域及女性研發人才培育計畫目標為建構一個「以智慧物聯技術與實務應用為基礎的教育環境和實作場域」,並規劃出符合此STEM教育領域的創新特色課程,以畢業前進入企業實習的方式,讓學生了解相關產業界所面對的問題,再輔以業界實作場域的教育訓練活動,共同帶領學生發展出動手做、判斷與解決問題的相關技能;本計畫也規劃讓學生以專題實作的組隊方式,跟業界協力領導學生對外參與智慧物聯技術的應用競賽,不僅可以累積學生實務開發的能力,更能激發其潛能來幫助企業解決所面臨的難題。

Data Science Meetup 台灣資料科學社群的使命是「為資料科學人士與企業創建經濟機會」。我們相信大數據蘊藏著巨量的信息和價值,如何處理好大數據並發掘其潛藏的商業價值,就要靠資料科學有效的應用。21世紀是資料科學決勝時代,我們社群將為大家提供與資料科學相關的最新技術和資訊實戰攻略,並透過全球業界人士和學者幫助相關職業規劃與挑戰,社群活動包含

  • 台北實體版聚
  • 線上版聚
  • Mentorship Program

歡迎加入我們社團瞭解更多資訊:https://www.facebook.com/groups/datasciencemeetup/

--

--

Yasmine Cheng
數據領航員

NLP Lab @ SCU | Data Science | to be a nlper 💻 Linkedin:Ya Mian(Yasmine) Cheng Github:Yasmine-Cheng