在 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]