pin_drop当前位置:知识文库 ❯ 图文
NumPy数组索引全面指南 - 布尔索引与花式索引
一、概述
NumPy数组索引是访问和修改数组元素的基本方式。NumPy支持多种索引方式:基本索引(整数索引)、负数索引、多维索引、布尔索引和花式索引。掌握这些索引方式是高效操作NumPy数组的关键。
二、索引语法
一维索引
代码示例
arr[index]
arr[-index]多维索引
代码示例
arr[row, col]
arr[row][col]布尔索引
代码示例
arr[condition]花式索引
代码示例
arr[[idx1, idx2, idx3]]三、索引方式说明
四、代码示例
示例1:一维数组索引
代码示例
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
# 正向索引
print(f"arr[0] = {arr[0]}")
print(f"arr[2] = {arr[2]}")
print(f"arr[4] = {arr[4]}")
# 负向索引
print(f"arr[-1] = {arr[-1]}")
print(f"arr[-2] = {arr[-2]}")
# 修改元素
arr[1] = 99
print(f"修改后: {arr}")输出:
代码示例
arr[0] = 10
arr[2] = 30
arr[4] = 50
arr[-1] = 50
arr[-2] = 40
修改后: [10 99 30 40 50]示例2:二维数组索引
代码示例
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 访问单个元素
print(f"arr[0, 0] = {arr[0, 0]}")
print(f"arr[1, 2] = {arr[1, 2]}")
print(f"arr[-1, -1] = {arr[-1, -1]}")
# 访问整行
print(f"arr[0] = {arr[0]}")
print(f"arr[-1] = {arr[-1]}")
# 两种等价写法
print(f"arr[1][2] = {arr[1][2]}")
print(f"arr[1, 2] = {arr[1, 2]}")
# 修改元素
arr[0, 0] = 100
print(f"修改后:\n{arr}")输出:
代码示例
arr[0, 0] = 1
arr[1, 2] = 6
arr[-1, -1] = 9
arr[0] = [1 2 3]
arr[-1] = [7 8 9]
arr[1][2] = 6
arr[1, 2] = 6
修改后:
[[100 2 3]
[ 4 5 6]
[ 7 8 9]]提示:
arr[i, j]比arr[i][j]更高效,因为前者是一次索引操作,后者是两次索引操作。
示例3:布尔索引与花式索引
代码示例
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80])
# 布尔索引:筛选大于40的元素
mask = arr > 40
print(f"大于40的元素: {arr[mask]}")
# 组合条件
mask2 = (arr >= 30) & (arr <= 60)
print(f"30到60之间: {arr[mask2]}")
# 花式索引:按索引列表访问
indices = [0, 2, 5, 7]
print(f"指定索引元素: {arr[indices]}")
# 花式索引二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
rows = [0, 2]
cols = [1, 2]
print(f"指定行列: {arr2d[rows, cols]}")
# 使用np.where
indices_where = np.where(arr > 40)
print(f"大于40的索引: {indices_where[0]}")输出:
代码示例
大于40的元素: [50 60 70 80]
30到60之间: [30 40 50 60]
指定索引元素: [10 30 60 80]
指定行列: [2 9]
大于40的索引: [4 5 6 7]五、实际应用场景
-
数据清洗:使用布尔索引筛选出异常值(如大于3倍标准差的数据)
-
图像处理:通过多维索引访问特定像素点的RGB值
-
数据分析:使用花式索引提取特定行的数据
六、注意事项
注意:NumPy索引从0开始,负数索引从-1开始,与Python列表一致。
注意:布尔索引中的组合条件必须使用
&(与)、|(或),不能用and/or,且条件需加括号。
注意:花式索引返回的是副本而非视图,修改花式索引结果不会影响原数组。
七、索引方式对比
八、小结
-
基本索引:用整数访问元素,负数索引从末尾计数
-
多维索引:用逗号分隔各维度索引,arr[i,j]比arr[i][j]更高效
-
布尔索引:按条件筛选元素,组合条件用&和|并加括号
-
花式索引:按索引列表访问,返回副本而非视图
小贴士
np.where()函数非常实用,它返回满足条件的元素的索引(而非元素本身),可以与其他索引方式结合使用。例如np.where(arr > 0)返回所有正数的位置索引。此外,np.nonzero()与np.where()在单条件情况下功能相同。更多高级索引技巧可以参考NumPy索引文档。
九、练习题
练习1
创建一个5×5的二维数组(1到25),使用索引访问第3行第4列的元素。
练习2
创建一个包含1到20的数组,使用布尔索引筛选出所有偶数。
练习3
创建一个4×4的二维数组,使用花式索引提取对角线元素。
常见问题
为什么布尔索引不能使用and和or?
Python的and和or关键字是针对单个布尔值设计的,无法处理数组级别的逐元素运算。NumPy使用&(按位与)和|(按位或)运算符,它们可以对布尔数组进行逐元素操作。因此组合条件必须写成(arr > 1) & (arr < 10),每个条件都要加括号。
花式索引返回副本有什么影响?
花式索引返回的是数据的副本,修改花式索引的结果不会影响原数组。这与切片不同(切片返回视图,修改会影响原数组)。如果需要通过花式索引修改原数组,应该直接在原数组上操作:arr[indices] = new_values。
arr[rows, cols]中的rows和cols如何配对?
当使用arr[rows, cols]进行花式索引时,rows和cols中的元素会一一配对。例如rows=[0,2], cols=[1,2]会选取(0,1)和(2,2)两个位置的元素,结果是[arr[0,1], arr[2,2]]。如果想选取rows和cols的笛卡尔积(所有组合),需要使用np.ix_()函数。
如何在多维数组中使用布尔索引?
在多维数组上使用布尔索引时,条件数组的形状必须与目标数组一致或可广播。例如arr2d[arr2d > 5]会返回所有大于5的元素,结果是一维数组。也可以在不同维度上分别使用布尔索引,但要注意广播规则。
本文涉及AI创作
内容由AI创作,请仔细甄别