首页 > 人工智能 > 人工智能 > 人工智能之数据分析 numpy:第五章 索引与切片
第五章 索引与切片
在 NumPy 中,
索引(indexing)与切片(slicing) 是访问和操作
ndarray 元素的核心手段。相比 Python 原生列表,NumPy 提供了更强大、更灵活的多维索引机制,包括
基本索引、高级索引、布尔索引、花式索引等。
本文详细讲解 NumPy 数组的索引与切片方法。
适用于
整数、切片对象(
:),返回的是
原数组的视图(view)(不复制数据)。
import numpy as np a = np.array([10, 20, 30, 40, 50]) # 索引(从0开始) print(a[0]) # 10 print(a[-1]) # 50(倒数第一个) # 切片:start:stop:step print(a[1:4]) # [20 30 40](不包含索引4) print(a[:3]) # [10 20 30] print(a[::2]) # [10 30 50](步长为2) print(a[::-1]) # [50 40 30 20 10](反转)
✅ 切片返回的是 视图,修改会影响原数组:
b = a[1:3] b[0] = 999 print(a) # [10 999 30 40 50] ← 原数组被修改!
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 1]) # 等价于 arr[0][1] → 2 print(arr[-1, -1]) # 9
推荐使用
arr[i, j]而非arr[i][j],前者更高效且支持高级功能。
print(arr[1, :]) # 第1行所有列 → [4 5 6] print(arr[:, 2]) # 第2列所有行 → [3 6 9] print(arr[0:2, 1:3]) # 前两行,第1~2列 # [[2 3] # [5 6]]
...适用于高维数组,自动补全冒号:
# 三维数组 x = np.random.rand(2, 3, 4) print(x[..., 0]) # 等价于 x[:, :, 0] → 取最后一维第0个
当使用 整数数组、布尔数组进行索引时,触发 高级索引, 返回副本(copy),而非视图。
用整数列表或数组指定要取的索引位置。
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 取第0行和第2行 print(arr[[0, 2]]) # [[1 2 3] # [7 8 9]] # 同时指定行和列(一一对应) print(arr[[0, 1, 2], [0, 1, 2]]) # → [1, 5, 9](对角线) # 等价于 [arr[0,0], arr[1,1], arr[2,2]] # 取任意位置组合 rows = np.array([0, 2]) cols = np.array([2, 0]) print(arr[rows, cols]) # [3, 7]
⚠️ 注意:
arr[[0,1],[0,1]]≠arr[0:2, 0:2]前者是高级索引(取两个点),后者是基本切片(取子矩阵)。
用布尔数组筛选满足条件的元素。
arr = np.array([10, 20, 30, 40, 50]) # 创建布尔掩码 mask = arr > 30 print(mask) # [False False False True True] print(arr[mask]) # [40 50] # 直接在索引中写条件 print(arr[arr % 20 == 0]) # [20 40] # 二维示例 matrix = np.array([[1, 2], [3, 4], [5, 6]]) print(matrix[matrix > 3]) # [4 5 6]
✅ 布尔索引常用于数据清洗、条件赋值等场景。
a = np.array([1, 2, 3]) a[0] = 99 print(a) # [99 2 3]
a[1:] = 0 print(a) # [99 0 0]
b = np.array([1, 2, 3, 4, 5]) b[b > 3] = -1 print(b) # [1 2 3 -1 -1]
c = np.array([10, 20, 30, 40]) c[[0, 2]] = [99, 88] print(c) # [99 20 88 40]
np.newaxis 或
None:增加维度x = np.array([1, 2, 3]) print(x.shape) # (3,) y = x[:, np.newaxis] # 列向量 print(y.shape) # (3, 1) # [[1] # [2] # [3]]
np.where():条件索引arr = np.array([1, 2, 3, 4, 5]) indices = np.where(arr > 3) # 返回满足条件的索引元组 print(indices) # (array([3, 4]),) print(arr[indices]) # [4 5] # 也可用于三元选择 result = np.where(arr > 3, arr, 0) # 满足条件保留,否则设为0 # [0 0 0 4 5]
| 问题 | 说明 |
|---|---|
| 视图 vs 副本 | 基本切片返回视图;高级索引返回副本 |
| 维度丢失 |
arr[0] 对二维数组返回一维,若想保持二维用
arr[0:1] |
| 越界错误 | 索引超出范围会报
IndexError |
| 负步长切片 |
a[::-1] 安全,但
a[3:0:-1] 不包含索引0 |
| 混合索引 |
arr[1, [0,2]] 是合法的(基本+高级混合) |
| 索引类型 | 示例 | 返回 | 是否修改原数组 |
|---|---|---|---|
| 基本索引 |
arr[1],
arr[1:3] |
视图 | 是 |
| 花式索引 |
arr[[1,3]] |
副本 | 否 |
| 布尔索引 |
arr[arr>0] |
副本 | 否 |
| 多维混合 |
arr[1, [0,2]] |
副本 | 否 |
掌握这些索引与切片技巧,你就能高效地提取、筛选和修改 NumPy 数组中的数据,为数据分析、图像处理、机器学习等任务打下坚实基础。
部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。
公众号:咚咚王 gitee: https://gitee.com/wy18585051844/ai_learning

《Python编程:从入门到实践》 《利用Python进行数据分析》 《算法导论中文第三版》 《概率论与数理统计(第四版) (盛骤) 》 《程序员的数学》 《线性代数应该这样学第3版》 《微积分和数学分析引论》 《(西瓜书)周志华-机器学习》 《TensorFlow机器学习实战指南》 《Sklearn与TensorFlow机器学习实用指南》 《模式识别(第四版)》 《深度学习 deep learning》伊恩·古德费洛著 花书 《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》 《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》 《自然语言处理综论 第2版》 《Natural-Language-Processing-with-PyTorch》 《计算机视觉-算法与应用(中文版)》 《Learning OpenCV 4》 《AIGC:智能创作时代》杜雨+&+张孜铭 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》 《从零构建大语言模型(中文版)》 《实战AI大模型》 《AI 3.0》
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048224/viewspace-3103054/ ,如需转载,请注明出处,否则将追究法律责任。