Python資料科學學習筆記-Numpy陣列基礎操作
本篇文章為筆者的學習筆記,參考書籍為 歐萊禮/Python資料科學學習手冊/Jake VanderPlas/何敏煌(譯) https://www.books.com.tw/products/0010774364
建立陣列的各種方式
內容全為0的陣列
np.zeros(10, dtype=np.int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
內容全為1的陣列
np.ones((3,5), dtype=np.int)
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
填滿同一元素
np.full((3,5), 3.14, dtype=np.float)
array([[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14]])
依序填滿的矩陣
np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
產生特定間隔數的陣列
np.linspace(0,1,5)
array([0. , 0.25, 0.5 , 0.75, 1. ])
隨機陣列
np.random.random((3,3))
array([[0.67008401, 0.66344056, 0.66557893],
[0.211046 , 0.63600443, 0.51327634],
[0.75571898, 0.94306233, 0.6197861 ]])
隨機常態分佈陣列
np.random.normal(0,1(3,3))
array([[ 1.04213031, 0.77624605, -0.42446014],
[ 0.07087546, 0.81222484, -0.52451604],
[ 1.98723693, -0.91196085, 0.78381324]])
隨機範圍整數矩陣
np.random.randint(0,10, 10)
array([9, 7, 5, 2, 0, 3, 9, 3, 3, 4])
單位矩陣
np.eye(5)
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
未初始化矩陣
np.empty(5)
array([1., 1., 1., 1., 1.])
陣列屬性
x = np.random.randint(0,10,(2,3))
-
陣列維度 : x.ndim => 2
-
各維度大小 : x.shape => (2, 3)
-
整個陣列總大小 : x.size => 6
-
陣列的資料型態 : x.dtype => dtype(‘int32’)
-
陣列元素的位元組大小 : x.itemsize => 4 (Bytes)
-
陣列總位元組大小 : x.nbytes => 24 (Bytes)
陣列操作
x2 = np.array([[12, 5, 6, 1],
[ 7, 6, 8, 8],
[ 1, 6, 7, 7]])
- 取得2列3欄 :
x2[:2, :3]
array([[12, 5, 6],
[ 7, 6, 8]])
- 取得所有偶數欄 :
x2[:3, ::2]
array([[12, 6],
[ 7, 8],
[ 1, 7]])
- 取得陣列的第1列元素 :
x2[:, 0]
array([12, 7, 1])
- 取得陣列的第1欄元素 :
x2[0, :]
array([12, 5, 6, 1])
所有陣列操作都是藉由
參考
來執行,會改變原變數的值
若不想改變原變數的值,則藉由np.array.copy()來執行
- 陣列變形
x3 = np.arange(1,10)
- 將x3更改為3x3矩陣 :
x3.reshape(3,3)
- 透過x3建立列向量(reshape) :
x3.reshap(3, 1)
- 透過x3建立列向量(newaxis) :
x3[np.newaxis, :]
- 透過x3建立欄向量(reshape) :
x3.reshap(1, 3)
- 透過x3建立欄向量(newaxis) :
x3[:, np.newaxis]
- 將x3更改為3x3矩陣 :
- 陣列的合併
np.concatenate, np.vstack(垂直堆疊), np.hstack(水平堆疊), np.dstack(3D)
x = np.array([1,2,3]) y = np.array([4,5,6]) z = np.array([[99], [99]]) grid = np.array([[1,2,3], [4,5,6]])
-
合併陣列np.concatenate([x, y])
[1,2,3,4,5,6]
-
合併陣列np.concatenate(grid, grid)
[[1,2,3], [4,5,6], [1,2,3], [4,5,6]]
-
合併陣列np.concatenate(grid, grid, axis=1)
[[1,2,3,1,2,3], [4,5,6,4,5,6]]
-
垂直堆疊合併np.vstack(x, grid)
[[1, 2, 3], [1, 2, 3], [4, 5, 6]]
-
水平堆疊合併np.hstack([z, grid])
[[99, 1, 2, 3], [99, 4, 5, 6]]
-
- 陣列的分割
np.split, np.vsplit(垂直分割), np.hsplit(水平分割)
x = [1,2,3,99,99,3,2,1] grid = [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]
-
分割陣列np.split(x, [3,5])
[1,2,3], [99,99], [3,2,1]
-
垂直分割陣列np.vsplit(grid, [2])
upper, lower = np.vsplit(grid, [2]) upper = [[0, 1, 2, 3], [4, 5, 6, 7]] lower = [[ 8, 9, 10, 11], [12, 13, 14, 15]]
-
水平分割陣列np.hvsplit(grid, [2])
left, right = np.hsplit(grid, [2]) left = [[ 0 1] [ 4 5] [ 8 9] [12 13]][[0, 1, 2, 3], [4, 5, 6, 7]] right = [[ 2 3] [ 6 7] [10 11] [14 15]][[ 8, 9, 10, 11], [12, 13, 14, 15]]
-