NumPy 中文教程

第一部分:基础认知与环境准备
第 1 章 全面认识 NumPy
第 2 章 开发环境搭建与验证
第二部分:核心对象 ——ndarray 数组
第 3 章 ndarray 数组基础
第 4 章 数组的形状与维度操作
第四部分:高级应用与数据处理
第 8 章 数组的排序、查找与去重
第 9 章 缺失值与异常值处理
第 10 章 随机数生成与抽样
第 11 章 文件读写与数据交互
第五部分:实战场景与落地应用
第 12 章 数值计算实战
第 13 章 数据分析实战
第六部分:优化进阶与问题解决
第 14 章 NumPy 性能优化
第 15 章 NumPy 进阶扩展
第 16 章 常见问题与解决方案

5.2 多维数组索引与切片

NumPy高级索引与切片教程:掌握多维数组操作技巧

NumPy 中文教程

本教程从基础到高级,全面讲解NumPy多维数组的索引与切片方法,包括二维数组的行列索引、三维及以上数组的轴索引、布尔索引、花式索引,以及如何使用&、|、~运算符进行条件组合筛选,适合新人学习,简单易懂。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

NumPy多维数组索引与切片教程

引言

NumPy是Python中用于科学计算的核心库,其多维数组(ndarray)功能强大,支持高效的索引与切片操作。索引是访问数组元素的方式,切片是提取数组子集的技术。本教程将详细讲解NumPy的多维数组索引与切片,从基础概念到高级技巧,帮助您轻松掌握这些操作。

1. 多维数组索引与切片基础

在NumPy中,索引从0开始,切片使用冒号 : 分隔起始、结束和步长。对于一维数组,索引和切片与Python列表类似。

import numpy as np

# 创建一维数组
arr = np.array([0, 1, 2, 3, 4, 5])
# 索引示例
print(arr[2])  # 输出: 2
# 切片示例
print(arr[1:4])  # 输出: [1 2 3]

对于多维数组,索引和切片可以沿多个轴进行。

2. 二维数组索引

二维数组可以看作是行和列的矩阵。索引时,使用逗号分隔不同轴的索引。

2.1 行索引和列索引

  • 行索引:选择特定行。
  • 列索引:选择特定列。
# 创建二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 行索引
print(arr_2d[1])  # 输出: [4 5 6](第二行)
# 列索引
print(arr_2d[:, 1])  # 输出: [2 5 8](第二列)
# 组合索引:选择特定元素
print(arr_2d[1, 2])  # 输出: 6(第二行第三列)

2.2 切片组合

切片可以与索引组合,提取子数组。

# 切片组合示例
print(arr_2d[0:2, 1:3])  # 输出: [[2 3] [5 6]](前两行的第二、三列)
# 步长切片
print(arr_2d[::2, ::2])  # 输出: [[1 3] [7 9]](隔行隔列选择)

3. 三维及以上数组索引

三维数组可以想象为多个二维数组堆叠。索引使用逗号分隔轴,每个轴对应一个维度。

3.1 轴索引的概念

轴(axis)是数组的维度方向。在三维数组中,轴0通常表示“深度”或“层”,轴1表示行,轴2表示列。

# 创建三维数组
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 形状为(2, 2, 2)
print(arr_3d.shape)  # 输出: (2, 2, 2)
# 轴索引示例
print(arr_3d[0, :, :])  # 输出: [[1 2] [3 4]](第一个二维切片)
print(arr_3d[:, 1, :])  # 输出: [[3 4] [7 8]](所有二维切片的第二行)

3.2 更高维数组

对于更高维度,原理相同,使用更多逗号分隔索引。

# 创建四维数组示例
arr_4d = np.random.rand(2, 3, 4, 5)  # 形状(2, 3, 4, 5)
print(arr_4d[0, :, :, 0])  # 提取第一个维度第一层和最后一个维度第一列的切片

4. 多维数组的布尔索引

布尔索引使用布尔数组(True/False值)来选择元素,常用于条件筛选。

4.1 布尔数组索引

首先创建一个布尔数组,其形状与目标数组一致或可广播。

# 创建二维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 创建布尔条件
condition = arr > 5
print(condition)
# 输出:
# [[False False False]
#  [False False  True]
#  [ True  True  True]]
# 应用布尔索引
print(arr[condition])  # 输出: [6 7 8 9](所有大于5的元素)

4.2 应用

布尔索引常用于数据清洗和筛选。

# 示例:选择偶数元素
arr = np.array([1, 2, 3, 4, 5])
print(arr[arr % 2 == 0])  # 输出: [2 4]

5. 多维数组的花式索引

花式索引使用整数数组来索引,可以非顺序地选择元素。

5.1 整数数组索引

使用列表或数组指定索引位置。

# 一维数组花式索引
arr = np.array([10, 20, 30, 40, 50])
indices = [0, 2, 4]
print(arr[indices])  # 输出: [10 30 50]

# 多维数组花式索引
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 选择特定行
print(arr_2d[[0, 2]])  # 输出: [[1 2 3] [7 8 9]]
# 选择特定行和列
print(arr_2d[[0, 2], [1, 2]])  # 输出: [2 9](第一个二维切片的第二列和第三个二维切片的第三列)

5.2 应用

花式索引用于不规则数据提取。

# 示例:从三维数组中选择特定层
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d[[0, 1], :, :])  # 选择所有层,等价于整个数组

6. 条件组合筛选

NumPy支持使用逻辑运算符 &(与)、|(或)、~(非)来组合多个条件。

6.1 使用&、|、~运算符

注意:必须使用括号来分组条件,因为Python运算符优先级问题。

# 创建数组
arr = np.array([1, 2, 3, 4, 5, 6])
# 组合条件:大于2且小于5
condition = (arr > 2) & (arr < 5)
print(condition)  # 输出: [False False  True  True False False]
print(arr[condition])  # 输出: [3 4]

# 使用|(或)
condition = (arr < 3) | (arr > 5)
print(arr[condition])  # 输出: [1 2 6]

# 使用~(非)
condition = ~(arr % 2 == 0)  # 非偶数,即奇数
print(arr[condition])  # 输出: [1 3 5]

6.2 多维数组示例

条件组合同样适用于多维数组。

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
condition = (arr_2d > 3) & (arr_2d < 8)
print(arr_2d[condition])  # 输出: [4 5 6 7]

总结

本教程详细介绍了NumPy多维数组的索引与切片操作,包括基础索引、二维数组的行列索引、三维及以上数组的轴索引、布尔索引、花式索引以及条件组合筛选。通过代码示例,您可以轻松上手这些技巧,并应用于数据分析和科学计算中。建议多加练习,以熟练掌握这些强大功能。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包