一、什麼是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的基礎操作。後續可以探索更高級的功能,如線性代數、傅里葉變換等,進一步提升數值計算能力!

小夜