🎯 学习目标

  • 理解NumPy数组的核心概念
  • 掌握数组的创建与操作
  • 学会数组索引与切片
  • 了解广播机制与向量化运算
NumPy
图:NumPy是Python数据科学的核心库

📦 数组创建

import numpy as np # 从列表创建 arr = np.array([1, 2, 3, 4, 5]) # 创建特殊数组 zeros = np.zeros((3, 4)) # 全零矩阵 ones = np.ones((2, 3)) # 全一矩阵 empty = np.empty((2, 2)) # 未初始化 eye = np.eye(3) # 单位矩阵 # 创建序列 range_arr = np.arange(0, 10, 2) # [0, 2, 4, 6, 8] linspace = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1] # 随机数组 random_arr = np.random.randn(3, 3) # 标准正态分布 randint_arr = np.random.randint(0, 10, (3, 3)) # 整数 # 数组属性 print(arr.shape) # 形状 print(arr.dtype) # 数据类型 print(arr.ndim) # 维度 print(arr.size) # 元素总数

✂️ 索引与切片

基本索引

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 单元素访问 print(arr[0, 1]) # 2 print(arr[-1, -1]) # 9 # 行/列切片 print(arr[0, :]) # [1, 2, 3] print(arr[:, 0]) # [1, 4, 7] print(arr[1:, :2]) # [[4, 5], # [7, 8]]

高级索引

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # 布尔索引 mask = arr > 5 print(arr[mask]) # [6, 7, 8, 9] # 花式索引 indices = [0, 2, 4, 6] print(arr[indices]) # [1, 3, 5, 7] # 条件赋值 arr[arr > 5] = 0 print(arr) # [1, 2, 3, 4, 5, 0, 0, 0, 0]

🔄 数组变形

arr = np.arange(12) # reshape: 改变形状 matrix = arr.reshape(3, 4) # [[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]] # -1自动计算维度 auto_shape = arr.reshape(3, -1) # flatten: 展平为一维 flat = matrix.flatten() # 转置 transposed = matrix.T # 升维/降维 expanded = arr[np.newaxis, :] # 添加新轴 squeezed = expanded.squeeze() # 移除长度为1的轴 # 堆叠 a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) vstacked = np.vstack([a, b]) # 垂直堆叠 hstacked = np.hstack([a, b]) # 水平堆叠

📡 广播机制

不同形状数组的运算

NumPy会自动扩展较小的数组以匹配较大的数组形状

# 标量与数组 arr = np.array([1, 2, 3]) print(arr + 10) # [11, 12, 13] # 不同形状数组 matrix = np.array([[1, 2, 3], [4, 5, 6]]) vector = np.array([10, 20, 30]) # 广播:vector扩展为(2, 3) print(matrix + vector) # [[11, 22, 33], # [14, 25, 36]] # 广播规则 # 1. 从后往前比较维度 # 2. 维度相等或其中一个为1时可广播 # 3. 缺失维度视为1

向量化运算

💡
向量化优势

避免Python循环,使用NumPy内置函数可提升10-100倍性能。

import numpy as np import time # 生成大数组 size = 10_000_000 a = np.random.randn(size) b = np.random.randn(size) # 向量化运算(快) start = time.time() c = a + b print(f"向量化: {time.time() - start:.4f}秒") # 循环运算(慢) start = time.time() c = [a[i] + b[i] for i in range(size)] print(f"循环: {time.time() - start:.4f}秒") # 常用向量化函数 arr = np.random.randn(1000) print(np.sum(arr)) # 求和 print(np.mean(arr)) # 均值 print(np.std(arr)) # 标准差 print(np.max(arr)) # 最大值 print(np.min(arr)) # 最小值 print(np.argmax(arr)) # 最大值索引

📝 本节小结

  • • NumPy数组是多维高效数据容器
  • • 索引和切片支持高级选择操作
  • • 广播机制使不同形状数组可运算
  • • 向量化运算比循环快得多