AIKFC 知識農 numpy 教學
目錄
numpy 基本觀念
建立陣列 (Array)
陣列基本運算
陣列的索引 (indexing)、分割 (slicing)
陣列的迭代 (iterating)
numpy 基本觀念
numpy 是 python 的模組。主要用於處理多維度的矩陣運算。
一個 numpy 矩陣所儲存的資料,資料型態必須一致。
在 numpy 中,"維度"(dimensions) 又稱作 "軸"(axes)。
一維陣列範例
一個一維陣列為
[1, 2, 1]
內有三個元素,表示此陣列的長度是 3
二維陣列範例
一個二維陣列為
[[1.,0.,0.],
[0.,1.,2.]]
第一個維度長度是 2。第二個維度長度是 3。
Numpy 的矩陣類別又稱為 ndarray
。ndarray 與 python 標準函式庫的 array 不同。
Python 的 array 一次僅能處理一個維度的數值。
ndarray
物件有一些重要的屬性 : ndarray.ndim
, ndarray.shape
, ndarray.size
, ndarray.dtype
, ndarray.itemsize,
ndarray.data`
ndarray.ndim : 陣列中第一個維度的長度
矩陣 [[1, 0, 0], [0, 1, 2]] 的 ndim = 2
ndarray.shape : 陣列每個維度裡的元素個數
假設有一個矩陣有 n 列 m 行,則矩陣的 shape = (n, m),以 tuple 表示。
也可理解為每個維度的 ndim
ndarray.size
陣列中所有元素的數量。矩陣 [[1, 0, 0], [0, 1, 2]] 的 size = 6
也可理解為此陣列 shape 中的元素相乘。
一個矩陣有 n 列 m 行,則矩陣的 size = n * m
.ndarray.dtype : 陣列中元素的資料型態。有 numpy.int32, numpy.int16, 以及 numpy.float64 ... 等等。
int32 的 "32" 表示位元數 (bit),即一個整數佔 32 bit。float64 表示一個浮點數佔 64 bit。
ndarray.itemsize : 陣列中元素佔用的位元組。
一個 float64
的數值,其 itemsize = 8 (64/8。1 bytes = 8 bits)
以下程式示範 ndim
, shape
, size
, dtype
, itemsize
Below are some example codes to illustrate the functions associated to dimensions: Ndim, shape, size, dtype, itemsize.
建立陣列 (Array)
以 np.array()
建立 numpy array。
zeros()
函式會建立一個內容全是 0 的陣列。
ones()
函式會建立一個內容全是 1 的陣列。
empty()
函式會建立一個內容全是隨機數值的陣列。
陣列基本運算
numpy 陣列的運算是 "elementwise" 的。意思是運算會擴展到所有元素中
在 numpy 中,矩陣乘法可使用 @
運算子或是 dot()
函式
sum()
函式會將 array 中所有元素加總
min()
函式會取 array 中元素的最小值
max()
函式會取 array 中元素的最大值
承上,`sum()`, `min()`, `cumsum()` 函式也可以針對特定的維度做加法、取最小值,以及計算累積的加總值
考慮 b 是一個 3x4 的二為矩陣
[[0 1 2 3]
[4 5 6 7]
[8 9 10 11]]
b.sum(axis=0)
表示以第一個維度的元素加總,即 0+4+8, 1+5+9, 2+6+10, 與 3+7+11,矩陣為 [12 15 18 21]
b.min(axis=1)
表示取第二個維度的最小值,即 [0 1 2 3] 取 0、[4 5 6 7] 取 4、[8 9 10 11] 取 8。矩陣為 [0 4 8]
b.cumsum(axis=1)
表示以第二個維度累加,即 [[0 1 3 6] [4 9 15 22] [8 17 27 38]]
Universal function
numpy 提供數學的函式計算,例如 sin, cos, exponential
這些函式也稱作 "萬用函式" (universal function)。計算同樣是 "elementwise"
arange()
arange(N) 將自動產生一個從 0 到 N-1 的矩陣。N 是一個正整數
exp()
exp(B) 將對矩陣 B 的所有元素做 exponential 運算
add()
add(B, C) 會將 B, C 矩陣對應位置的元素相加
陣列的索引 (indexing)、分割 (slicing)
numpy 當中,陣列的分割 (slicing) 可以有三個輸入 : "start"、"stop" 與 "step"
有三種計算索引和分割的方式
array [ num1 ] 。取出 num1 位置的元素,是一個值
array [ num_start: num_end ]。分割出陣列中從 "num_start" 至 "num_end - 1" 的所有元素 ( 不包含 "num_end" 元素 )
array [ num_start:num_end: step_size ]。分割出陣列中從 "num_start" 至 "num_end - 1" 的所有元素 ( 不包含 "num_end" 元素 ),且每隔 "step_size" 取一次值
以下先建立矩陣 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
以下是陣列 slicing 範例
陣列的迭代 (iterating)
考慮 b 是一個 5x4 的二維陣列
[[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]]
使用迭代的方式,印出第一個維度的元素
利用 flat
,將矩陣展開變成一維陣列
b.flat
將變成
[0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43]
再以迭代方式印出第一個維度的元素,會將所有數字印出來