一、NumPy 簡介
1.1 NumPy 特性
- 高性能科學計算庫:專為處理多維數組設計,底層用 C 語言實現,運算速度遠超 Python 原生列表。
- 矢量運算:支持批量數據操作,避免顯式循環,代碼更簡潔高效。
- 廣播機制:自動處理不同形狀數組間的運算。
- 豐富函數庫:包含線性代數、傅里葉變換、隨機數等功能。
1.2 應用場景
- 數據分析:處理大規模結構化數據。
- 機器學習:作為 TensorFlow/PyTorch 等框架的底層支持。
- 科學計算:物理模擬、統計學分析。
- 圖像處理:多維數組表示像素數據。
1.3 安裝與導入
pip install numpyimport numpy as np
二、NumPy 基礎 —— 數組對象
2.1 數組與列表對比
特性 | NumPy 數組 (ndarray) | Python 列表 (list) |
數據類型 | 元素類型必須一致 | 可包含任意類型元素 |
內存存儲 | 連續內存空間,訪問速度快 | 非連續存儲,訪問較慢 |
運算效率 | 支持向量化運算,速度快 | 需顯式循環,速度慢 |
維度支持 | 支持 n 維數組 | 僅支持一維結構 |
2.2 創建數組的四種方式
方法 | 語法 | 示例 |
np.array() | 從列表 / 元組創建 | arr1 = np.array([10, 20, 30, 40]) |
np.arange() | 生成等差數列 | arr2 = np.arange(0, 10, 2) |
np.random | 生成隨機數組 | arr3 = np.random.random((2, 3)) |
特殊函數 | zeros/ones/full/eye | arr_zeros = np.zeros((3, 3)) |
代碼示例
通過np.array
創建數組
import numpy as np
a = np.array([1, 2, 3, 4])
print(a) # 輸出結果: [1 2 3 4]
通過np.arange
創建數組
import numpy as np
a = np.arange(0, 10, 2) # 創建0-10,步數為2的數組
print(a) # 輸出結果: [0 2 4 6 8]
通過np.random.random
創建數組
import numpy as np
a = np.random.random((2, 3))
print(a) # 輸出類似于: [[0.04631855 0.21257259 0.73199394]# [0.59865848 0.15601864 0.15599452]]
通過特殊函數創建數組
import numpy as np
array_zeros = np.zeros((3, 3)) # 3行3列全零數組
array_ones = np.ones((4, 4)) # 4行4列全一數組
array_full = np.full((2, 3), 9) # 值為9的2行3列數組
array_eye = np.eye(4) # 生成一個在斜方形上元素為1,其他元素都為0的4行4列矩陣
print(array_zeros) # 輸出: [[0. 0. 0.]# [0. 0. 0.]# [0. 0. 0.]]
print(array_ones) # 輸出: [[1. 1. 1. 1.]# [1. 1. 1. 1.]# [1. 1. 1. 1.]# [1. 1. 1. 1.]]
print(array_full) # 輸出: [[9 9 9]# [9 9 9]]
print(array_eye) # 輸出: [[1. 0. 0. 0.]# [0. 1. 0. 0.]# [0. 0. 1. 0.]# [0. 0. 0. 1.]]
三、數組數據類型
3.1 核心數據類型
類型 | 描述 | 標識符 | 示例 |
bool | 布爾值 | b | True/False |
int8 | 1 字節整數 | i1 | -128~127 |
int32 | 4 字節整數 | i4 | -2147483648~2147483647 |
float16 | 半精度浮點數 | f2 | 16 位,精度約 3 位小數 |
float64 | 雙精度浮點數 | f8 | 標準浮點數 |
object | Python 對象 | O | 存儲類實例等 |
3.2 類型操作
查詢數據類型
import numpy as npclass Person: # 定義Person類def __init__(self, name, age):self.name = nameself.age = agezs = Person('張三', 18) # 產生對象
ls = Person('李四', 20)
d = np.array([zs, ls])
print(d) # 輸出: [__main__.Person object at 0x00000176CB4F2208 __main__.Person object at 0x00000176CB4F2288]
print(d.dtype) # 輸出: dtype('O')
創建數組指定數據類型
import numpy as np
a = np.array([1, 2, 3, 4, 5], dtype='int32') # 使用dtype指定創建數組的數據類型
print(a) # 輸出結果: [1 2 3 4 5]
print(a.dtype) # 輸出: int32
修改數據類型
import numpy as np
a = np.array([1, 2, 3, 4, 5])
f = a.astype('float16') # 使用astype改變數組的數據類型
print(f.dtype) # 輸出結果: float16
四、多維數組操作
4.1 維度與形狀
數組 | 維度 (ndim) | 形狀 (shape) | 含義 |
[1,2,3] | 1 | (3,) | 一維數組,3 個元素 |
[[1,2],[3,4]] | 2 | (2,2) | 2 行 2 列二維數組 |
[[[1,2],[3,4]],[[5,6],[7,8]]] | 3 | (2,2,2) | 3 維數組,2 個 2x2 矩陣 |
4.2 基本操作
數組維度查詢
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([[1, 2, 3], [4, 5, 6]])
a3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(a1.ndim) # 輸出: 1
print(a2.ndim) # 輸出: 2
print(a3.ndim) # 輸出: 3
數組形狀查詢
import numpy as np
a1 = np.array([1, 2, 3])
a2 = np.array([[1, 2, 3], [4, 5, 6]])
a3 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(a1.shape) # 輸出: (3,)
print(a2.shape) # 輸出: (2, 3)
print(a3.shape) # 輸出: (2, 2, 3)
修改數組形狀
import numpy as np
a1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
a2 = a1.reshape((2, 6)) # reshape是將數組轉換成指定的形狀,然后返回轉換后的結果,原數組的形狀不會發生改變
print(a2) # 輸出: [[ 1 2 3 4 5 6]# [ 7 8 9 10 11 12]]
print(a1.shape) # 輸出: (4, 3)
a1.resize((4, 3)) # resize是將數組轉換成指定的形狀,會直接修改數組本身,并且不會返回任何值
print(a1) # 輸出: [[1 2 3]# [4 5 6]# [7 8 9]# [10 11 12]]
通過特殊函數創建數組
import numpy as np
array_zeros = np.zeros((3, 3)) # 3行3列全零數組
array_ones = np.ones((4, 4)) # 4行4列全一數組
array_full = np.full((2, 3), 9) # 值為9的2行3列數組
array_eye = np.eye(4) # 生成一個在斜方形上元素為1,其他元素都為0的4行4列矩陣
print(array_zeros) # 輸出: [[0. 0. 0.]# [0. 0. 0.]# [0. 0. 0.]]
print(array_ones) # 輸出: [[1. 1. 1. 1.]# [1. 1. 1. 1.]# [1. 1. 1. 1.]# [1. 1. 1. 1.]]
print(array_full) # 輸出: [[9 9 9]# [9 9 9]]
print(array_eye) # 輸出: [[1. 0. 0. 0.]# [0. 1. 0. 0.]# [0. 0. 1. 0.]# [0. 0. 0. 1.]]
4.3 素組索引
下標索引
import numpy as np
a = np.arange(6) # 一維數組
print(a) # 輸出: [0 1 2 3 4 5]
print(a[2]) # 輸出: 2
print(a[-2]) # 輸出: 4(從后往前數第2個)a = np.arange(9).reshape(3, 3) # 二維數組
print(a) # 輸出: [[0 1 2]# [3 4 5]# [6 7 8]]
print(a[0][1]) # 輸出: 1
print(a[0, 1]) # 輸出: 1
切片索引
import numpy as np
a = np.arange(6) # 一維數組
print(a) # 輸出: [0 1 2 3 4 5]
print(a[1:5]) # 輸出: [1 2 3 4]
print(a[1:5:2]) # 輸出: [1 3]
print(a[::2]) # 輸出: [0 2 4]
print(a[::-1]) # 輸出: [5 4 3 2 1 0]a = np.arange(9).reshape(3, 3) # 二維數組
print(a) # 輸出: [[0 1 2]# [3 4 5]# [6 7 8]]
print(a[1:3, 1:2]) # 輸出: [[4]# [7]]
print(a[1, :]) # 輸出: [3 4 5]
print(a[1, ...]) # 輸出: [3 4 5]
print(a[:, 1]) # 輸出: [1 4 7]
花式索引
import numpy as np
a = np.arange(6) # 一維數組
print(a) # 輸出: [0 1 2 3 4 5]
print(a[[1, 2, 5]]) # 輸出: [1 2 5]
print(a[np.array([(0, 1, 3), (1, 4, 5)])]) # 輸出: [[0 1 3]# [1 4 5]]a = np.arange(9).reshape(3, 3) # 二維數組
print(a) # 輸出: [[0 1 2]# [3 4 5]# [6 7 8]]
print(a[[1, 0]]) # 輸出: [[3 4 5]# [0 1 2]]
print(a[[0, 2], 1]) # 輸出: [1 7]
print(a[np.ix_([0, 1], [0, 1])]) # 輸出: [[0 1]# [3 4]]
布爾索引
import numpy as np
a = np.arange(6) # 一維數組
print(a) # 輸出: [0 1 2 3 4 5]
print(a > 3) # 輸出: [False False False False True True]
print(a[a > 3]) # 輸出: [4 5]a = np.arange(9).reshape(3, 3) # 二維數組
print(a) # 輸出: [[0 1 2]# [3 4 5]# [6 7 8]]
print(a > 3) # 輸出: [[False False False]# [False True True]# [ True True True]]
print(a[a > 3]) # 輸出: [4 5 6 7 8]