pin_drop当前位置:知识文库 ❯ 图文

NumPy数组索引全面指南 - 布尔索引与花式索引

一、概述

NumPy数组索引是访问和修改数组元素的基本方式。NumPy支持多种索引方式:基本索引(整数索引)、负数索引、多维索引、布尔索引和花式索引。掌握这些索引方式是高效操作NumPy数组的关键。


二、索引语法

一维索引

代码示例

arr[index]
arr[-index]

多维索引

代码示例

arr[row, col]
arr[row][col]

布尔索引

代码示例

arr[condition]

花式索引

代码示例

arr[[idx1, idx2, idx3]]

三、索引方式说明

索引方式 语法 说明
正向索引 arr[0] 从0开始计数
负向索引 arr[-1] 从末尾开始计数,-1为最后一个
多维索引 arr[i, j] 同时指定各维度索引
切片索引 arr[start:stop:step] 访问一段连续元素
布尔索引 arr[condition] 按条件筛选元素
花式索引 arr[[i1,i2]] 按索引列表访问

四、代码示例

示例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,且条件需加括号。

注意:花式索引返回的是副本而非视图,修改花式索引结果不会影响原数组。


七、索引方式对比

索引方式 返回类型 是否视图 适用场景
整数索引 标量 - 访问单个元素
切片索引 ndarray 是(视图) 访问连续区域
布尔索引 ndarray 否(副本) 条件筛选
花式索引 ndarray 否(副本) 按索引列表访问

八、小结

  • 基本索引:用整数访问元素,负数索引从末尾计数

  • 多维索引:用逗号分隔各维度索引,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的元素,结果是一维数组。也可以在不同维度上分别使用布尔索引,但要注意广播规则。

标签: 数组索引 布尔索引 NumPy 花式索引 多维索引 数据筛选

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: NumPy数组属性详解 - shape/dtype/ndim全面指南 下一篇: NumPy数组切片教程 - 视图与副本的区别详解

poll相关推荐