一、什麼是Numpy?¶
在Python的數值計算世界裏,Numpy是一個核心庫。它提供了高性能的多維數組對象,以及一系列用於處理這些數組的工具。相比Python原生的列表,Numpy數組能更高效地進行數值運算,尤其適合數據科學、機器學習、科學計算等場景。如果你接觸過Excel表格、矩陣運算,或者想處理大量數據,Numpy會是你的得力助手。
二、安裝與導入¶
首先,確保你安裝了Numpy。如果還沒安裝,可以用pip命令:
pip install numpy
在代碼中導入Numpy(通常簡寫爲np):
import numpy as np
三、創建Numpy數組¶
Numpy數組是處理數據的基本單位,我們先看看如何創建數組。
1. 從Python列表創建數組¶
最簡單的方式是用np.array(),傳入一個列表即可生成數組:
# 一維數組
arr1 = np.array([1, 2, 3, 4])
print(arr1) # 輸出:[1 2 3 4]
# 二維數組(列表的列表)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 輸出:
# [[1 2 3]
# [4 5 6]]
2. 使用Numpy內置函數創建數組¶
Numpy提供了很多快捷函數,適合生成特定結構的數組:
- 全0數組:
np.zeros(shape, dtype=float)
zeros_arr = np.zeros((3, 4)) # 形狀爲(3,4)的全0數組
print(zeros_arr)
# 輸出:
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
- 全1數組:
np.ones(shape, dtype=float)
ones_arr = np.ones((2, 2)) # 形狀爲(2,2)的全1數組
print(ones_arr)
# 輸出:
# [[1. 1.]
# [1. 1.]]
- 等差數列:
np.arange(start, end, step)(類似Python的range)
arange_arr = np.arange(0, 10, 2) # 從0開始,步長2,到10結束(不包含10)
print(arange_arr) # 輸出:[0 2 4 6 8]
- 均勻分佈數組:
np.linspace(start, end, num)(生成num個均勻分佈的數)
linspace_arr = np.linspace(0, 10, 5) # 生成5個數,從0到10均勻分佈
print(linspace_arr) # 輸出:[ 0. 2.5 5. 7.5 10. ]
- 隨機數組:
np.random系列函數(如正態分佈、均勻分佈)
# 生成3x3的標準正態分佈隨機數組(均值0,標準差1)
rand_arr = np.random.randn(3, 3)
print(rand_arr)
四、數組的基礎屬性¶
瞭解數組的屬性能幫你快速掌握它的結構。常見屬性有:
shape:數組的形狀(維度)ndim:數組的維度數量dtype:數組元素的數據類型size:數組元素的總數
示例:
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.int32) # 指定數據類型爲整數
print("形狀:", arr.shape) # 輸出:(2, 3)(2行3列)
print("維度:", arr.ndim) # 輸出:2(二維數組)
print("數據類型:", arr.dtype) # 輸出:int32
print("元素總數:", arr.size) # 輸出:6(2×3=6)
五、數組的索引與切片¶
數組的索引和切片是訪問元素的核心操作,類似Python列表但更靈活。
1. 一維數組¶
arr = np.array([1, 3, 5, 7, 9])
print(arr[0]) # 訪問第一個元素:1
print(arr[-1]) # 訪問最後一個元素:9
print(arr[1:4]) # 切片:從索引1到4(不包含4):[3, 5, 7]
2. 二維數組¶
二維數組可以理解爲“表格”,用逗號分隔行和列的索引:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 第0行第1列:2
print(arr[1, :]) # 第1行所有列:[4 5 6]
print(arr[:, 2]) # 所有行第2列:[3 6 9]
print(arr[0:2, 1:3]) # 切片:前2行,後2列(左閉右開)
# 輸出:
# [[2 3]
# [5 6]]
3. 布爾索引(按條件篩選)¶
用布爾數組作爲索引,篩選出滿足條件的元素:
arr = np.array([1, 3, 5, 7, 9])
mask = arr > 3 # 生成布爾數組:[False, False, True, True, True]
print(arr[mask]) # 輸出:[5 7 9](篩選出大於3的元素)
六、數組的基礎運算¶
Numpy數組支持高效的元素級運算和矩陣運算,比Python列表的運算更簡潔。
1. 算術運算(元素級操作)¶
Numpy數組的算術運算符(+, -, *, /等)是元素級的,即每個元素獨立運算:
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 元素相加:[5, 7, 9]
print(arr1 * arr2) # 元素相乘:[4, 10, 18]
print(arr1 / arr2) # 元素相除:[0.25, 0.4, 0.5]
⚠️ 注意:Python列表的+是拼接(如[1,2]+[3,4]=[1,2,3,4]),而Numpy數組的+是元素相加。
2. 矩陣運算(線性代數)¶
- 矩陣乘法:用
np.dot()或@運算符(對應數學中的矩陣乘法)
A = np.array([[1, 2], [3, 4]]) # 2x2矩陣
B = np.array([[5, 6], [7, 8]]) # 2x2矩陣
C = A @ B # 矩陣乘法:A×B
print(C)
# 輸出:
# [[19 22]
# [43 50]]
- 點積:
np.dot(a, b)計算兩個向量的點積(標量)
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
print(np.dot(v1, v2)) # 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32
3. 廣播機制(不同形狀數組的運算)¶
當運算的數組形狀不同時,Numpy會自動“廣播”(擴展)小數組以匹配大數組合法運算。常見場景:
- 數組與標量運算:標量會自動擴展到數組的每個元素
arr = np.array([1, 2, 3])
print(arr + 2) # 每個元素加2:[3, 4, 5]
- 形狀兼容的數組:維度爲1的軸會被擴展
arr1 = np.array([[1, 2, 3], [4, 5, 6]]) # 2x3數組
arr2 = np.array([10, 20, 30]) # 1x3數組(等價於[10,20,30])
print(arr1 + arr2) # 每行分別加arr2:
# [[11 22 33]
# [14 25 36]]
七、簡單應用示例¶
1. 數組統計分析¶
Numpy內置了大量統計函數,快速計算數組的關鍵指標:
arr = np.array([1, 2, 3, 4, 5])
print("總和:", arr.sum()) # 15
print("均值:", arr.mean()) # 3.0
print("標準差:", arr.std()) # 1.4142...
print("最大值:", arr.max()) # 5
print("最小值:", arr.min()) # 1
2. 數據篩選與處理¶
結合索引和布爾運算,快速篩選異常值:
data = np.array([10, 5, 20, 8, 15])
# 篩選出大於10的元素
filtered = data[data > 10]
print(filtered) # 輸出:[10, 20, 15](注意:10也大於10,包含在內)
八、總結與練習¶
Numpy是Python數值計算的基石,掌握它能極大提升數據處理效率。關鍵知識點回顧:
- 數組創建:從列表、zeros/ones/arange/linspace等
- 數組屬性:shape、ndim、dtype、size
- 索引切片:一維/二維數組、布爾索引
- 基礎運算:元素級算術、矩陣乘法、廣播機制
練習建議:
1. 嘗試生成不同形狀的隨機數組,並計算其均值、方差
2. 用Numpy實現簡單的矩陣乘法(3x3矩陣×3x2矩陣)
3. 對二維數組進行切片,提取子矩陣並計算和
通過以上內容,你已經能初步掌握Numpy的基礎操作。後續可以探索更高級的功能,如線性代數、傅里葉變換等,進一步提升數值計算能力!