人工智能之数据分析 numpy:第五章 索引与切片

人工智能之数据分析 numpy

第五章 索引与切片


文章目录

  • [人工智能之数据分析 numpy](#人工智能之数据分析 numpy)
  • 前言
  • [一、基本索引与切片(Basic Indexing and Slicing)](#一、基本索引与切片(Basic Indexing and Slicing))
    • [1. 一维数组](#1. 一维数组)
    • [2. 多维数组(以二维为例)](#2. 多维数组(以二维为例))
      • [(1) 单个元素访问](#(1) 单个元素访问)
      • [(2) 行/列切片](#(2) 行/列切片)
      • [(3) 使用省略号 `...`](#(3) 使用省略号 ...)
  • [二、高级索引(Advanced Indexing)](#二、高级索引(Advanced Indexing))
    • [1. 整数数组索引(花式索引,Fancy Indexing)](#1. 整数数组索引(花式索引,Fancy Indexing))
    • [2. 布尔索引(Boolean Indexing)](#2. 布尔索引(Boolean Indexing))
  • 三、修改数组元素
    • [1. 基本索引赋值(影响原数组)](#1. 基本索引赋值(影响原数组))
    • [2. 切片赋值](#2. 切片赋值)
    • [3. 布尔索引赋值](#3. 布尔索引赋值)
    • [4. 花式索引赋值](#4. 花式索引赋值)
  • 四、特殊索引技巧
    • [1. `np.newaxis` 或 `None`:增加维度](#1. np.newaxisNone:增加维度)
    • [2. `np.where()`:条件索引](#2. np.where():条件索引)
  • 五、注意事项与常见陷阱
  • 六、小结:索引方式对比
  • 后续
  • 资料关注

前言

在 NumPy 中,索引(indexing)与切片(slicing) 是访问和操作 ndarray 元素的核心手段。相比 Python 原生列表,NumPy 提供了更强大、更灵活的多维索引机制,包括基本索引、高级索引、布尔索引、花式索引等。

本文详细讲解 NumPy 数组的索引与切片方法。


一、基本索引与切片(Basic Indexing and Slicing)

适用于整数、切片对象(: ,返回的是原数组的视图(view)(不复制数据)。

1. 一维数组

python 复制代码
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](反转)

✅ 切片返回的是视图,修改会影响原数组:

python 复制代码
b = a[1:3]
b[0] = 999
print(a)  # [10 999 30 40 50] ← 原数组被修改!

2. 多维数组(以二维为例)

python 复制代码
arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

(1) 单个元素访问

python 复制代码
print(arr[0, 1])   # 等价于 arr[0][1] → 2
print(arr[-1, -1]) # 9

推荐使用 arr[i, j] 而非 arr[i][j],前者更高效且支持高级功能。

(2) 行/列切片

python 复制代码
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]]

(3) 使用省略号 ...

适用于高维数组,自动补全冒号:

python 复制代码
# 三维数组
x = np.random.rand(2, 3, 4)
print(x[..., 0])   # 等价于 x[:, :, 0] → 取最后一维第0个

二、高级索引(Advanced Indexing)

当使用整数数组、布尔数组 进行索引时,触发高级索引返回副本(copy),而非视图。

1. 整数数组索引(花式索引,Fancy Indexing)

用整数列表或数组指定要取的索引位置。

python 复制代码
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]

前者是高级索引(取两个点),后者是基本切片(取子矩阵)。


2. 布尔索引(Boolean Indexing)

用布尔数组筛选满足条件的元素。

python 复制代码
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]

✅ 布尔索引常用于数据清洗、条件赋值等场景。


三、修改数组元素

1. 基本索引赋值(影响原数组)

python 复制代码
a = np.array([1, 2, 3])
a[0] = 99
print(a)  # [99 2 3]

2. 切片赋值

python 复制代码
a[1:] = 0
print(a)  # [99 0 0]

3. 布尔索引赋值

python 复制代码
b = np.array([1, 2, 3, 4, 5])
b[b > 3] = -1
print(b)  # [1 2 3 -1 -1]

4. 花式索引赋值

python 复制代码
c = np.array([10, 20, 30, 40])
c[[0, 2]] = [99, 88]
print(c)  # [99 20 88 40]

四、特殊索引技巧

1. np.newaxisNone:增加维度

python 复制代码
x = np.array([1, 2, 3])
print(x.shape)         # (3,)
y = x[:, np.newaxis]   # 列向量
print(y.shape)         # (3, 1)
# [[1]
#  [2]
#  [3]]

2. np.where():条件索引

python 复制代码
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》

相关推荐
yy_xzz2 小时前
【OpenCV + VS】C++实现动态下雪特效
c++·人工智能·opencv
扬道财经2 小时前
从百度分析师到GEO理论奠基人,罗小军探索AI搜索营销新路径
人工智能·百度·dubbo
xuehaisj2 小时前
菠萝蜜果实目标检测_yolo11-C3k2-ConvFormer改进
人工智能·目标检测·目标跟踪
月下倩影时2 小时前
视觉学习篇——模型推理部署:从“炼丹”到“上桌”
人工智能·深度学习·学习
夕小瑶2 小时前
从无形IP到AI万象,安谋科技Arm China“周易”X3 NPU 发布!
人工智能·科技·tcp/ip
陈天伟教授2 小时前
人工智能技术-人工智能与科学-03 预测分子性能
人工智能
【建模先锋】2 小时前
基于密集连接的DenseNet故障诊断模型:实现高鲁棒性的深度故障诊断
人工智能·cnn·信号处理·故障诊断·轴承故障诊断·西储大学数据集
java1234_小锋3 小时前
[免费]基于python的Flask+Vue医疗疾病数据分析大屏可视化系统(机器学习随机森林算法+requests)【论文+源码+SQL脚本】
python·机器学习·数据分析·flask·疾病数据分析
谅望者3 小时前
数据分析笔记10:数据容器
笔记·数据挖掘·数据分析