Numpy的基礎入門
Numpy 是 Python 的一個重要模組,主要用於資料處理上。Numpy 底層以 C 和 Fortran 語言實作,所以能快速操作多重維度的陣列。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式函式庫。
當 Python 處理龐大資料時,其原生 list 效能表現並不理想(但可以動態存異質資料),而 Numpy 具備平行處理的能力,可以將操作動作一次套用在大型陣列上。此外 Python 其餘重量級的資料科學相關套件(例如:Pandas、SciPy、Scikit-learn 等)都幾乎是奠基在 Numpy 的基礎上。
Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray(N-dimensional array)上。ndarray 的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector 而二維陣列為 matrix。一開始我們會引入 numpy 模組,透過傳入 list 到 numpy.array() 創建陣列。
建立陣列
>>> import numpy as np >>> x = np.array([1, 2, 3]) >>> x array([1, 2, 3]) >>> y = np.arange(10) # 類似 Python 的 range, 但是回傳 array >>> y array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
基本運算
>>> a = np.array([1, 2, 3, 6]) >>> b = np.linspace(0, 2, 4) # 建立一個array, 在0與2的範圍之間讓4個點等分 >>> c = a - b >>> c array([ 1. , 1.33333333, 1.66666667, 4. ]) >>> a**2 array([ 1, 4, 9, 36])
運算子 | 說明 | 舉例 | 結果 |
+ | 加 | A=6+3 | A=9 |
- | 減 | A=6-3 | A=3 |
* | 乘 | A=6*3 | A=18 |
/ | 浮點除法 | A=7/3 | A=3.5 |
// | 整數除法(去除小數點) | A=7//2 | A=3 |
% | 相除後求餘數 | A=7%2 | A=1 |
** | 次方 | A=3**2 | A=9 |
運算子 | 說明 | 範例 | 縮寫 |
+= | 加 | A=A+2 | A += 2 |
-= | 減 | A=A-2 | A -= 2 |
*= | 乘 | A=A*2 | A *= 2 |
/= | 浮點除法 | A=A/2 | A /= 2 |
//= | 整數除法(去除小數點) | A=A//2 | A //= 2 |
%= | 相除後求餘數 | A=A%2 | A %= 2 |
**= | 次方 | A=A**2 | A **= 2 |
全域方法
>>> a = np.linspace(-np.pi, np.pi, 100) >>> b = np.sin(a) >>> c = np.cos(a)
線性代數
>>> from numpy.random import rand >>> from numpy.linalg import solve, inv >>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]]) >>> a.transpose() array([[ 1. , 3. , 5. ], [ 2. , 4. , 9. ], [ 3. , 6.7, 5. ]]) >>> inv(a) array([[-2.27683616, 0.96045198, 0.07909605], [ 1.04519774, -0.56497175, 0.1299435 ], [ 0.39548023, 0.05649718, -0.11299435]]) >>> b = np.array([3, 2, 1]) >>> solve(a, b) # 解方程式 ax = b array([-4.83050847, 2.13559322, 1.18644068]) >>> c = rand(3, 3) # 建立一個 3x3 隨機矩陣 >>> c array([[ 3.98732789, 2.47702609, 4.71167924], [ 9.24410671, 5.5240412 , 10.6468792 ], [ 10.38136661, 8.44968437, 15.17639591]]) >>> np.dot(a, c) # 矩陣相乘 array([[ 53.61964114, 38.8741616 , 71.53462537], [ 118.4935668 , 86.14012835, 158.40440712], [ 155.04043289, 104.3499231 , 195.26228855]])
Numpy 陣列
Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray(N-dimensional array)上。ndarray 的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector 而二維陣列為 matrix。一開始我們會引入 numpy 模組,透過傳入 list 到 numpy.array() 創建陣列。
# 引入 numpy 模組 import numpy as np np1 = np.array([1, 2, 3]) np2 = np.array([3, 4, 5]) # 陣列相加 print(np1 + np2) # [4 6 8] # 顯示相關資訊 print(np1.ndim, np1.shape, np1.dtype) # 1 (3,) int64 => 一維陣列, 三個元素, 資料型別 np3 = np.array([1, 2, 3, 4, 5, 6])
(1)從檔案取資料
npd = np.genfromtxt('data.csv', delimiter=',')
(2)改變陣列維度
np3 = np3.reshape([2, 3]) print(np3.ndim, np3.shape, np3.dtype) # 2 (2, 3) int64
(3)改變陣列型別(bool、int、float、string)
bool 可以包含 True、False,int 可以包含 int16、int32、int64。其中數字是指 bits。float 可以包含 16、32、64 表示小數點後幾位。string 可以是 string、unicode。nan 則表示遺失值。
np3 = np3.astype('int64') np3.dtype # dtype('int64')
建立陣列
np1 = np.zeros([2, 3]) # array([[ 0., 0., 0.], [ 0., 0., 0.]]) np2 = np.ones([2, 3]) # array([[ 1., 1., 1.], [ 1., 1., 1.]])
(1)陣列索引與切片
一維陣列操作和 Python 原生 list 類似
np3 = np.array([1, 2, 3, 4, 5, 6]) print(np3[2]) # 3
二維陣列
np3 = np3.reshape([2, 3]) print(np3[1, 0]) # 4
(2)基本操作
使用布林遮罩來取值
np3 = np.array([1, 2, 3, 4, 5, 6]) print(np3 > 3) # [False False False True True True] print(np3[np3 > 3]) # [4 5 6]
加總
np3 = np3.reshape([2, 3]) print(np3.sum(axis=1)) # 將 axis=1 橫向加總 [6 15]
延伸參考資料
https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.loadtxt.html
https://docs.scipy.org/doc/numpy-1.13.0/user/basics.io.genfromtxt.html
https://www.numpy.org/devdocs/reference/generated/numpy.genfromtxt.html
熱門評論