11、NumPy 花式索引与索引技巧

系列文章:Numpy系列文章-CSDN博客      

目录

花式索引(Fancy Indexing)

示例 1:一维数组的花式索引

示例 2:二维数组的花式索引

索引技巧

布尔索引

组合索引

使用np.ix_进行多维花式索引


花式索引(Fancy Indexing)

        花式索引是指使用整数数组作为索引来访问数组中的元素。这种方式与基本的索引不同,它允许我们一次性获取数组中不连续的多个元素。

示例 1:一维数组的花式索引

import numpy as np

# 创建一个一维数组
arr = np.arange(1, 10)
print("Original array:", arr)

# 使用花式索引获取指定元素
indices = [2, 5, 7]
selected_elements = arr[indices]
print("Selected elements:", selected_elements)

 输出:

Original array: [1 2 3 4 5 6 7 8 9]
Selected elements: [3 6 8]

示例 2:二维数组的花式索引

花式索引也适用于二维数组,可以一次性访问数组中的多行、多列或多个不连续的元素。

# 创建一个二维数组
arr_2d = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
print("2D array:
", arr_2d)

# 使用花式索引选择数组的多行
rows_to_select = [0, 2]
selected_rows = arr_2d[rows_to_select]
print("Selected rows:
", selected_rows)

# 使用花式索引选择数组的多列
cols_to_select = [1, 2]
selected_cols = arr_2d[:, cols_to_select]
print("Selected columns:
", selected_cols)

输出:

2D array:
 [[10 20 30]
  [40 50 60]
  [70 80 90]]
Selected rows:
 [[10 20 30]
  [70 80 90]]
Selected columns:
 [[20 30]
  [50 60]
  [80 90]]

索引技巧

NumPy 还提供了更多索引技巧,使数组操作更加灵活。

布尔索引

布尔索引允许我们使用布尔数组作为索引来选择数组中满足特定条件的元素。

# 创建一个简单的数组
arr = np.array([10, 20, 30, 40, 50])

# 创建一个布尔数组
bool_indices = (arr > 20)
print("Boolean indices:", bool_indices)

# 使用布尔索引选择元素
selected_elements = arr[bool_indices]
print("Selected elements:", selected_elements)

输出:

Boolean indices: [False False  True  True  True]
Selected elements: [30 40 50]

组合索引

我们可以组合使用基本切片和花式索引来实现更复杂的数据选择。

# 创建一个二维数组
arr_2d = np.array([[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110, 120]])

# 使用组合索引访问元素
selected_elements = arr_2d[1:3, [1, 3]]
print("Selected elements:
", selected_elements)

输出:

Selected elements:
 [[ 60  80]
  [100 120]]

使用np.ix_进行多维花式索引

np.ix_函数可以帮助我们使用花式索引来选择多维数组中的特定区域。

# 创建一个三维数组
arr_3d = np.arange(27).reshape(3, 3, 3)
print("3D array:
", arr_3d)

# 使用 np.ix_ 选择特定区域
selected_region = arr_3d[np.ix_([0, 2], [0, 1], [0, 2])]
print("Selected region:
", selected_region)

输出:

3D array:
 [[[ 0  1  2]
   [ 3  4  5]
   [ 6  7  8]]
   
  [[ 9 10 11]
   [12 13 14]
   [15 16 17]]
   
  [[18 19 20]
   [21 22 23]
   [24 25 26]]]
Selected region:
 [[[ 0  2]
   [ 3  5]]

  [[18 20]
   [21 23]]]