numpy的特色
- 用陣列代替列表處理資料
- 適合處理多維度的資料
- pandas、tensorflow的基礎
- 運算速度遠高於列表(核心使用C、C++運作)
一、資料建立
01. numpy.array
# 一維資料
data = np.array([3, 4, -5])
# 二維資料
data = np.array([
[1, 2],
[3, 2],
[4, 0]
])
# 三維資料
data = np.array([
[
[5, 2, 4], [1, 2, 8],
],
[
[3, 8, 2], [4, 3, 1]
]
])
02. numpy.empty / zeros / ones / arange
# 建立空白資料
data = np.empty(3)
# 建立全0的資料
data = np.zeros([3, 2])
# 建立全1的資料
data = np.ones([2, 2, 2])
# 建立範圍(a ~ b-1)的資料
data = np.range(a, b)
二、資料運算
01. 逐元運算 (兩個數據的數量及維度要相同)
data1 = np.array([3, 2, 10])
data2 = np.array([1, 3, 6])
data1 + data2
data1 - data2
data1 * data2
data1 / data2
data1 > data2
data1 == data2
02. 矩陣運算
'''
# 內積矩陣運算 (第一個矩陣後面維度 = 第二個矩陣前面維度)
| 1 | | 1 5 | | 16 | (1 * 1 + 3 * 5)
| 3 | x | 4 2 | = | 10 | (1 * 4 + 3 * 2)
| 5 2 | | 11 | (1 * 5 + 3 * 2)
1x2 X 2x3 = 1x3
'''
data1 = np.array([
[1, 3]
])
data2 = np.array([
[1, 4, 5],
[5, 2, 2]
])
# 內積 (得到 1 x 3矩陣)
result = data1.dot(data2)
result = data1 @ data2
'''
# 外積矩陣運算
| 1 4 5 5 2 2 | ( 1 * 所有)
| 3 12 15 15 6 6 | ( 3 * 所有)
1x2 X 2x3 = 2x6
'''
# 外積
result = np.outer(data1, data2)
03. 統計運算 (只要一個多維資料即可)
data = np.array([
[2, 1, 7],
[-5, 3, 8]
])
print(f"全部加總: {data.sum()}")
print(f"找到最大值: {data.max()}")
print(f"找到最小值: {data.min()}")
print(f"平均數: {data.mean()}")
print(f"標準差: {data.std()}")
print(f"針對第一個維度(column)做總和: {data.sum(axis=0)}")
print(f"針對第二個維度(row)做總和: {data.sum(axis=1)}")
print(f"逐值累加: {data.cumsum()}")
三、資料形狀 Shape / T / reShape
import numpy as np
'''
維度 Dimension: 資料的層次 ex. 1, 2, 3
形狀 Shape: 表達資料的層次和各層次的資料數量 ex. [8], [2,4], [2, 2, 2]
'''
data = np.array([[1, 2], [3, 2], [4, 0]])
# 觀察資料形狀 (3 x 2)
print(data.shape)
# 轉置資料 (2 x 3), 常用在矩陣
print("--- 轉置前 ---")
print(data)
print("--- 轉置後 ---")
print(data.T)
# 扁平化 => 打平成一維資料 (1 x 7)
print(data.ravel())
print(data.ravel().shape)
# 重塑資料 => 重塑前後的資料總數要一致
shape1 = np.array([1, 2, 3, 4, 5, 6, 7, 8])
shape2 = shape1.reshape(4, 2)
# 亦可用在資料初始化
initialize = np.zeros(18).reshape(2, 3, 3)
print(initialize)
四、資料索引 Index & 資料切片 Slice
import numpy as np
data = np.array([
[1, 3, -1],
[1, 2, 3],
[5, -5, 3],
[3, 5, 1]
])
# 索引 Index (從0開始)
index_data = data[1, 2]
# 切片 Slice (包含前面,不包含後面)
# ex. [a:b] 擷取 a ~ b-1
# ... 表示都要
slice_data = data[..., 2:4] # 保留前面全部的層次
五、合併矩陣 vStack & hStack
import numpy as np
# 合併第一個維度
# np.vstack((陣列一, 陣列二, ...))
# 合併第二個維度
# np.hstack((陣列一, 陣列二, ...))
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 2 x 3
arr2 = np.array([[7, 8, 9], [10, 11, 12]]) # 2 x 3
arr3 = np.array([[13, 14], [15, 16]]) # 2 x 2
result1 = np.vstack((arr1, arr2)) # 合併第一個維度: '4' x 3
result2 = np.hstack((arr1, arr2, arr3)) # 合併第二個維度: 2 x '8'
print(result1) # [[1 2 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
print(result2) # [[1, 2, 3, 7, 8, 9, 13, 14], [4, 5, 6, 10, 11, 12, 15, 16]]
六、切割矩陣 vSplit & hSplit
import numpy as np
# 切割第一個維度
# np.vsplit(陣列, 切割數量)
# 切割第二個維度
# np.hsplit(陣列, 切割數量)
arr1 = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]]) # 2 x 4
result1 = np.vsplit(arr1, 1) # 切割第一個維度成1個: 2 x 4
result2 = np.vsplit(arr1, 2) # 切割第一個維度成2個: 1 x 4 + 1 x 4
result3 = np.hsplit(arr1, 1) # 切割第二個維度成1個: 2 x 4
result4 = np.hsplit(arr1, 2) # 切割第二個維度成2個: 2 x 2 + 2 x 2
result5 = np.hsplit(arr1, 4) # 切割第二個維度成4個: 2 x 1 + 2 x 1 + 2 x 1 + 2 x 1