在數據處理與科學計算領域,高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石,以高性能多維數組對象及配套函數,成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算,通過向量化操作直接處理每個元素,無需循環,大幅提升代碼效率與簡潔度。
算術運算
NumPy 數組可以直接進行加減乘除等算術運算,運算規則是對應元素之間進行操作。
a = np.array([1, 2, 3, 4, 5])b = np.array([6, 7, 8, 9, 10])# 加法print(a + b) # 輸出:[ 7 9 11 13 15]# 減法print(b - a) # 輸出:[5 5 5 5 5]# 乘法print(a * b) # 輸出:[ 6 14 24 36 50]# 除法print(b / a) # 輸出:[6. 3.5 2.66666667 2.25 2. ]
此外,NumPy 還提供了豐富的數學函數來進行算術運算,如 np.add()、np.subtract()、np.multiply()、np.divide() 等,它們的功能與運算符類似。
print(np.add(a, b)) # 輸出:[ 7 9 11 13 15],與 a + b 效果相同
比較運算
數組的比較運算會返回一個布爾類型的數組,其中每個元素表示對應位置的元素是否滿足比較條件。
a = np.array([1, 3, 5, 7, 9])b = np.array([2, 3, 6, 7, 8])print(a > b) # 輸出:[False False False False True]print(a == b) # 輸出:[False True False True False]print(a <= b) # 輸出:[ True True True True False]
邏輯運算
NumPy 提供了 np.logical_and()、np.logical_or()、np.logical_not() 等函數來進行邏輯運算。
a = np.array([True, True, False, False])b = np.array([True, False, True, False])print(np.logical_and(a, b)) # 輸出:[ True False False False]print(np.logical_or(a, b)) # 輸出:[ True True True False]print(np.logical_not(a)) # 輸出:[False False True True]
廣播機制
在 NumPy 中,形狀不同的數組運算會觸發廣播機制,它能自動擴展小數組,實現元素級運算。
廣播需遵循兩條規則:
- 維度數不同時,給維度少的數組前面補維,直至維度數一致。
- 各維度上,數組大小相同或其中一個為 1 才能廣播,否則報錯。
廣播示例如下:
# 示例 1:一維數組與標量運算a = np.array([1, 2, 3, 4, 5])b = 2print(a + b) # 輸出:[3 4 5 6 7],標量 b 被廣播為與 a 形狀相同的數組 [2, 2, 2, 2, 2]# 示例 2:二維數組與一維數組運算a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = np.array([10, 20, 30])print(a + b)# 輸出:# [[11 22 33]# [14 25 36]# [17 28 39]]# 一維數組 b 被廣播為與 a 形狀相同的二維數組 [[10, 20, 30], [10, 20, 30], [10, 20, 30]]# 示例 3:形狀兼容的二維數組運算a = np.array([[1, 2], [3, 4], [5, 6]]) # 形狀為 (3, 2)b = np.array([[10], [20], [30]]) # 形狀為 (3, 1)print(a * b)# 輸出:# [[ 10 20]# [ 60 80]# [150 180]]# 數組 b 被廣播為形狀 (3, 2) 的數組 [[10, 10], [20, 20], [30, 30]]
NumPy 的常用函數
NumPy 提供了大量的常用函數,用于數組的統計分析、數學計算等。
統計函數
- np.sum():計算數組元素的總和。
a = np.array([[1, 2, 3], [4, 5, 6]])print(np.sum(a)) # 輸出:21(所有元素的總和)print(np.sum(a, axis=0)) # 輸出:[5 7 9](按列求和)print(np.sum(a, axis=1)) # 輸出:[6 15](按行求和)
- np.mean():計算數組元素的平均值。
a = np.array([1, 2, 3, 4, 5, 6])print(np.mean(a)) # 輸出:3.5
- np.max() 和 np.min():分別計算數組元素的最大值和最小值。
a = np.array([[7, 2, 9], [4, 8, 3]])print(np.max(a)) # 輸出:9print(np.min(a, axis=0)) # 輸出:[4 2 3](按列求最小值)
- np.std() 和 np.var():分別計算數組元素的標準差和方差。
a = np.array([1, 2, 3, 4, 5])print(np.std(a)) # 輸出:1.41421356...print(np.var(a)) # 輸出:2.0
數學函數
- np.sqrt():計算數組元素的平方根。
a = np.array([4, 9, 16, 25])print(np.sqrt(a)) # 輸出:[2. 3. 4. 5.]
- np.exp():計算數組元素的指數(e 的冪)。
a = np.array([1, 2, 3])print(np.exp(a)) # 輸出:[ 2.71828183 7.3890561 20.08553692]
- np.log()、np.log2()、np.log10():分別計算自然對數、以 2 為底的對數和以 10 為底的對數。
a = np.array([1, 2, 4, 10])print(np.log(a)) # 輸出:[0. 0.69314718 1.38629436 2.30258509]print(np.log2(a)) # 輸出:[0. 1. 2. 3.32192809]print(np.log10(a)) # 輸出:[0. 0.30103 0.60205999 1. ]
其他常用函數
- np.argmax() 和 np.argmin():分別返回數組中最大值和最小值的索引。
a = np.array([[3, 1, 4], [2, 5, 0]])print(np.argmax(a)) # 輸出:4(最大值 5 在數組展平后的索引)print(np.argmin(a, axis=1)) # 輸出:[1 2](按行找最小值的索引)
- np.unique():返回數組中唯一的元素,并排序。
a = np.array([2, 1, 3, 2, 1, 4, 5, 4])print(np.unique(a)) # 輸出:[1 2 3 4 5]
- np.sort():對數組進行排序。
a = np.array([[3, 1, 4], [2, 5, 0]])print(np.sort(a)) # 輸出:[[1 3 4] [0 2 5]](按行排序)print(np.sort(a, axis=0)) # 輸出:[[2 1 0] [3 5 4]](按列排序)
NumPy 與其他庫的結合
NumPy 作為 Python 科學計算的基礎庫,經常與其他庫結合使用,發揮更強大的功能。
與 Matplotlib 結合
Matplotlib 是 Python 中常用的繪圖庫,它可以與 NumPy 無縫配合,繪制各種圖表。
import numpy as npimport matplotlib.pyplot as plt# 生成數據x = np.linspace(0, 2 * np.pi, 100)y = np.sin(x)# 繪制正弦曲線plt.plot(x, y)plt.title('Sine Curve')plt.xlabel('x')plt.ylabel('sin(x)')plt.show()
與 Pandas 結合
Pandas 是基于 NumPy 構建的數據分析庫,它的 Series 和 DataFrame 數據結構本質上都是基于 NumPy 的數組。在 Pandas 中,可以方便地將數據轉換為 NumPy 數組進行處理。
import numpy as npimport pandas as pd# 創建 DataFramedf = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})# 轉換為 NumPy 數組arr = df.valuesprint(arr)# 輸出:# [[1 4]# [2 5]# [3 6]]
NumPy 的高級應用
除了上述基礎內容,NumPy 還有許多高級應用,如線性代數運算、隨機數生成等。
線性代數運算
NumPy 的 linalg 模塊提供了豐富的線性代數運算函數。
- np.linalg.dot():計算兩個數組的點積。
a = np.array([[1, 2], [3, 4]])b = np.array([[5, 6], [7, 8]])print(np.linalg.dot(a, b))# 輸出:# [[19 22]# [43 50]]
- np.linalg.inv():計算矩陣的逆矩陣(僅適用于方陣)。
a = np.array([[1, 2], [3, 4]])inv_a = np.linalg.inv(a)print(inv_a)# 輸出:# [[-2. 1. ]# [ 1.5 -0.5]]
- np.linalg.eig():計算方陣的特征值和特征向量。
a = np.array([[1, 2], [3, 4]])eigenvalues, eigenvectors = np.linalg.eig(a)print("特征值:", eigenvalues) # 輸出:特征值: [-0.37228132 5.37228132]print("特征向量:\n", eigenvectors)# 輸出:特征向量:# [[-0.82456484 -0.41597356]# [ 0.56576746 -0.90937671]]
隨機數生成
NumPy 的 random 模塊提供了多種生成隨機數的函數。
- np.random.rand():生成 [0,1) 之間的隨機數。
# 生成形狀為 (2, 3) 的隨機數組print(np.random.rand(2, 3))# 輸出(每次運行結果可能不同):# [[0.4618034 0.01623568 0.85273445]# [0.49533646 0.89013761 0.97617472]]
- np.random.randint():生成指定范圍內的隨機整數。
# 生成形狀為 (3, 2),范圍在 [1, 10) 的隨機整數print(np.random.randint(1, 10, size=(3, 2)))# 輸出(每次運行結果可能不同):# [[5 3]# [7 9]# [2 6]]
- np.random.normal():生成符合正態分布的隨機數。
# 生成形狀為 (1, 5),均值為 0,標準差為 1 的正態分布隨機數print(np.random.normal(0, 1, size=(1, 5)))# 輸出(每次運行結果可能不同):# [[-0.3264997 -0.76003135 0.22776465 1.44944949 0.42473946]]