5.2 多维数组索引与切片
NumPy高级索引与切片教程:掌握多维数组操作技巧
本教程从基础到高级,全面讲解NumPy多维数组的索引与切片方法,包括二维数组的行列索引、三维及以上数组的轴索引、布尔索引、花式索引,以及如何使用&、|、~运算符进行条件组合筛选,适合新人学习,简单易懂。
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多维数组的索引与切片操作,包括基础索引、二维数组的行列索引、三维及以上数组的轴索引、布尔索引、花式索引以及条件组合筛选。通过代码示例,您可以轻松上手这些技巧,并应用于数据分析和科学计算中。建议多加练习,以熟练掌握这些强大功能。