NumPy - 高级索引
高级索引提供了一种强大的方法,可以根据预定条件或准则从 NumPy 数组中选择特定元素。
虽然基本索引(例如 array[1:4])为您提供了原始数组的"视图"(对切片的修改会影响原始数据),但高级索引始终会创建所选数据的副本。
它允许您从非元组序列的 ndarray、整数或布尔数据类型的 ndarray 对象或至少有一个项是序列对象的元组中选择元素。此方法有助于动态数据选择以及条件数据提取。
高级索引有两种类型 -
- 整数索引
- 布尔数组索引
整数索引
这允许您根据数组的 N 维索引,使用其确切位置(索引)从数组中选择特定元素。每个整数数组代表该维度的索引数量。
如果整数数组的数量与目标 ndarray 的维度相对应,则选择项目将变得简单直接。这就像在 x、y、z 位置选择项目一样。
示例:按索引选择元素
以下示例使用整数数组作为行和列,从数组的每一行中选择一个元素。选择包括第一个数组中 (0,0)、(1,1) 和 (2,0) 处的元素。以下是代码 -
import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print(x) print('新数组为: ', y)
以下是上述代码的输出 -
[[1 2] [3 4] [5 6]] 新数组为: [1 4 5]
示例:选择角元素
在以下示例中,选择位于 4X3 数组角的元素。选择的行索引为 [0, 0] 和 [3,3],而列索引为 [0,2] 和 [0,2]。
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print('我们的数组是: ', x) rows = np.array([[0,0],[3,3]]) cols = np.array([[0,2],[0,2]]) y = x[rows,cols] print('此数组的角元素是: ', y)
以下是上述代码的输出代码 −
我们的数组是: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 此数组的角元素是: [[ 0 2] [ 9 11]]
示例:访问特定分数
在此示例中,我们有一个二维数组,其中包含三个不同学生的分数,行表示三个学生的分数,三列表示三个不同科目(印地语、数学和英语)的分数。
现在,我们将了解如何访问学生 1 的印地语成绩和学生 2 的数学成绩。以下是代码 −
import numpy as np marks = np.array([[85, 99, 88], [78, 93, 85], [86, 45, 90]]) specific_results = marks[[0, 1], [0, 1]] print('分数: ', marks) print('选定分数: ', specific_results)
以上代码的输出如下 -
分数: [[85 99 88] [78 93 85] [86 45 90]] 选定分数: [85 93]
示例:索引越界错误
在 NumPy 中,当你尝试使用超出数组维度有效范围的索引访问数组中的元素时,会发生索引错误(索引越界)。
让我们通过一个示例来理解这一点:一个数组包含 3 行,但代码尝试访问第 4 行(索引 3),抛出了索引错误 -
import numpy as np x = np.array([[0, 1], [2, 3], [4, 65]]) print('二维数组为: ', x) print(x[3,1])
以下是上述代码的输出 -
二维数组为: [[ 0 1] [ 2 3] [ 4 65]] Traceback (most recent call last): File "/home/cg/root/22245/main.py", line 4, inprint(x[3,1]) IndexError: index 3 is out of bounds for axis 0 with size 3
布尔数组索引
NumPy 的布尔索引功能允许您选择满足特定条件的数组元素。它涉及创建一个布尔数组,其中每个元素都与 True 或 False 条件匹配。当布尔数组显示 True 时,将选择原始数组中的元素。
此方法非常适合使用逻辑条件(例如比较运算)过滤数据。它是从数组中提取特定值的强大工具。
示例:使用布尔数组选择特定元素
此代码演示了如何使用布尔数组作为掩码来从 NumPy 数组中选择特定元素。布尔数组指定最终数组中哪些元素应包含 (True) 或排除 (False)。
import numpy as np arr = np.array([10, 20, 30, 40, 50]) bool_array = np.array([True, False, True, False, True]) selected_elements = arr[bool_array] print("原始数组:", arr) print("布尔数组:", bool_array) print("选定元素:", selected_elements)
以上代码的输出如下 -
原始数组:[10 20 30 40 50] 布尔数组:[ True False True False True] 选定元素:[10 30 50]
示例:过滤大于 5 的项目
在此示例中,大于 5 的项目将通过布尔索引返回。
import numpy as np x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print('我们的数组是: ', x) print('大于 5 的项目是:' , x[x > 5])
运行上述程序,结果如下:
我们的数组是: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 大于 5 的项目是:[ 6 7 8 9 10 11]
示例:删除 NaN 值
在此示例中,使用 ~(补码运算符)省略 NaN(非数字)元素。
import numpy as np a = np.array([np.nan, 1,2,np.nan,3,4,5]) print(a[~np.isnan(a)])
运行上述程序,结果如下:-
[1. 2. 3. 4. 5.]
示例:过滤复数
以下示例演示如何从数组中过滤掉复数。
import numpy as np a = np.array([1, 2+6j, 5, 3.5+5j]) print(a[np.iscomplex(a)])
上述代码的输出如下:-
[2. +6.j 3.5+5.j]
示例:提取偶数
让我们看看如何使用布尔索引从数组中提取偶数 -
import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) print('偶数为:', x[x % 2 == 0])
以下是上述代码的输出 -
偶数为:[2 4 6 8]