在 NumPy 中,神奇索引(Fancy Indexing) 和 布尔索引(Boolean Indexing) 是两种强大的索引方式,用于从数组中提取特定元素或子集。以下是它们的详细说明和示例:
1. 神奇索引(Fancy Indexing)
-
定义:通过传递一个整数数组或列表来索引数组,返回指定位置的元素。
-
特点:
- 索引数组可以是任意形状。
- 返回的结果形状与索引数组一致。
-
示例:
-
import numpy as np array = np.array([10, 20, 30, 40, 50]) indices = [1, 3, 4] # 指定索引位置 result = array[indices] # 提取对应位置的元素 print(result) # 输出: [20 40 50]
-
多维数组示例:
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_indices = [0, 1, 2] col_indices = [1, 0, 2] result = matrix[row_indices, col_indices] # 提取 (0,1), (1,0), (2,2) 位置的元素 print(result) # 输出: [2 4 9]
2. 布尔索引(Boolean Indexing)
-
定义:通过传递一个布尔数组来索引数组,返回满足条件的元素。
-
特点:
- 布尔数组必须与目标数组形状一致。
- 返回的结果是一维数组。
-
示例:
array = np.array([10, 20, 30, 40, 50]) condition = array > 30 # 创建布尔条件 result = array[condition] # 提取满足条件的元素 print(result) # 输出: [40 50]
-
多维数组示例:
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) condition = matrix > 5 # 创建布尔条件 result = matrix[condition] # 提取满足条件的元素 print(result) # 输出: [6 7 8 9]
3. 神奇索引与布尔索引的区别
特性 | 神奇索引(Fancy Indexing) | 布尔索引(Boolean Indexing) |
---|---|---|
索引类型 | 整数数组或列表 | 布尔数组 |
结果形状 | 与索引数组一致 | 一维数组 |
适用场景 | 提取指定位置的元素 | 提取满足条件的元素 |
多维数组支持 | 支持,通过指定行列索引 | 支持,返回满足条件的所有元素 |
4. 应用场景
- 神奇索引:
- 提取特定位置的元素。
- 重新排列数组。
- 布尔索引:
- 过滤满足条件的元素。
- 数据清洗和预处理。
5. 注意事项
- 神奇索引:索引数组的值必须在数组的合法范围内,否则会抛出
IndexError
。 - 布尔索引:布尔数组必须与目标数组形状一致,否则会抛出
IndexError
。
示例代码总结
import numpy as np # 神奇索引
array = np.array([10, 20, 30, 40, 50])
indices = [1, 3, 4]
result_fancy = array[indices] # 输出: [20 40 50]# 布尔索引
condition = array > 30
result_boolean = array[condition] # 输出: [40 50]