4.2 高级索引


文档摘要

4.2 高级索引 NumPy 高级索引:深入探索灵活的数据访问方式 NumPy 的高级索引提供了一种比基本切片更强大的数据访问机制。它允许使用整数数组或布尔数组来选择 ndarray 中的元素,从而实现更灵活、更复杂的数据操作。本章将深入探讨 NumPy 的高级索引,包括整数数组索引和布尔数组索引,并通过实例代码和图表来帮助理解。 4.2.1 整数数组索引 整数数组索引允许使用整数数组来指定要选择的元素的索引。可以分别指定每个维度的索引数组,也可以使用一个整数数组来同时索引多个维度。 4.2.1.1 一维数组的整数数组索引 对于一维数组,可以直接使用一个整数数组来选择元素。 在这个例子中, 数组指定了要从 中选择的元素的索引。 返回一个新的数组,其中包含 中索引 0、2 和 4 对应的元素。

4.2 高级索引

NumPy 高级索引:深入探索灵活的数据访问方式

NumPy 的高级索引提供了一种比基本切片更强大的数据访问机制。它允许使用整数数组或布尔数组来选择 ndarray 中的元素,从而实现更灵活、更复杂的数据操作。本章将深入探讨 NumPy 的高级索引,包括整数数组索引和布尔数组索引,并通过实例代码和图表来帮助理解。

4.2.1 整数数组索引

整数数组索引允许使用整数数组来指定要选择的元素的索引。可以分别指定每个维度的索引数组,也可以使用一个整数数组来同时索引多个维度。

4.2.1.1 一维数组的整数数组索引

对于一维数组,可以直接使用一个整数数组来选择元素。

import numpy as np arr = np.array([10, 20, 30, 40, 50]) indices = np.array([0, 2, 4]) # 选择索引 0, 2, 4 对应的元素 result = arr[indices] print(result) # 输出: [10 30 50]

在这个例子中,indices 数组指定了要从 arr 中选择的元素的索引。arr[indices] 返回一个新的数组,其中包含 arr 中索引 0、2 和 4 对应的元素。

4.2.1.2 多维数组的整数数组索引

对于多维数组,可以使用多个整数数组来指定每个维度的索引。每个索引数组的长度必须相同。

import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_indices = np.array([0, 2]) # 选择行 0 和 2 col_indices = np.array([0, 1]) # 选择列 0 和 1 result = arr[row_indices, col_indices] print(result) # 输出: [1 8]

在这个例子中,row_indices 指定要选择的行,col_indices 指定要选择的列。arr[row_indices, col_indices] 返回一个新的数组,其中包含 arr 中 (0, 0) 和 (2, 1) 对应的元素。

可以使用 np.ix_ 函数来生成用于选择矩形区域的索引数组。

import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_indices = np.array([0, 2]) col_indices = np.array([1, 2]) row_indices, col_indices = np.ix_(row_indices, col_indices) result = arr[row_indices, col_indices] print(result) # 输出: # [[2 3] # [8 9]]

np.ix_ 函数将 row_indicescol_indices 转换为可以用于选择矩形区域的索引数组。

4.2.1.3 使用一个整数数组索引多个维度

可以使用一个整数数组来同时索引多个维度。在这种情况下,整数数组的每个元素都是一个元组,其中包含每个维度的索引。

import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) indices = np.array([[0, 0], [1, 1], [2, 2]]) # 选择 (0, 0), (1, 1), (2, 2) 对应的元素 result = arr[indices[:, 0], indices[:, 1]] # indices[:,0]代表行索引,indices[:,1]代表列索引 print(result) # 输出: [1 5 9] # 另一种写法 result = arr[tuple(indices.T)] print(result) # 输出:[1 5 9]

在这个例子中,indices 数组包含要选择的元素的坐标。arr[indices[:, 0], indices[:, 1]] 返回一个新的数组,其中包含 arr 中 (0, 0)、(1, 1) 和 (2, 2) 对应的元素。

图示:整数数组索引

4.2.2 布尔数组索引

布尔数组索引允许使用布尔数组来选择 ndarray 中的元素。布尔数组的形状必须与要索引的 ndarray 的形状兼容。

4.2.2.1 一维数组的布尔数组索引

对于一维数组,可以使用一个布尔数组来选择元素。布尔数组的长度必须与要索引的数组的长度相同。

import numpy as np arr = np.array([10, 20, 30, 40, 50]) mask = np.array([True, False, True, False, True]) # 选择索引 0, 2, 4 对应的元素 result = arr[mask] print(result) # 输出: [10 30 50]

在这个例子中,mask 数组指定了要从 arr 中选择的元素。arr[mask] 返回一个新的数组,其中包含 arrmask 数组中值为 True 的索引对应的元素。

4.2.2.2 多维数组的布尔数组索引

对于多维数组,可以使用一个布尔数组来选择元素。布尔数组的形状必须与要索引的数组的形状相同。

import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) mask = np.array([[True, False, True], [False, True, False], [True, False, True]]) result = arr[mask] print(result) # 输出: [1 3 5 7 9]

在这个例子中,mask 数组指定了要从 arr 中选择的元素。arr[mask] 返回一个新的数组,其中包含 arrmask 数组中值为 True 的元素。返回的是一个一维数组,因为多维布尔索引会展平数组。

4.2.2.3 使用条件表达式创建布尔数组

可以使用条件表达式来创建布尔数组,然后使用该布尔数组来索引 ndarray。

import numpy as np arr = np.array([10, 20, 30, 40, 50]) mask = arr > 25 # 创建一个布尔数组,其中元素大于 25 的值为 True result = arr[mask] print(result) # 输出: [30 40 50]

在这个例子中,arr > 25 创建一个布尔数组,其中 arr 中元素大于 25 的值为 True。然后,可以使用该布尔数组来选择 arr 中大于 25 的元素。

图示:布尔数组索引

4.2.3 高级索引与切片的区别

高级索引和切片是两种不同的数据访问机制。高级索引总是返回数据的副本,而切片返回数据的视图(如果可能)。这意味着对切片所做的更改会反映在原始数组中,而对高级索引所做的更改不会反映在原始数组中。

import numpy as np arr = np.array([10, 20, 30, 40, 50]) # 切片 slice_arr = arr[1:4] slice_arr[0] = 99 # 修改切片 print(arr) # 输出: [10 99 30 40 50] (原始数组被修改) # 高级索引 indices = np.array([1, 2, 3]) fancy_arr = arr[indices] fancy_arr[0] = 88 # 修改高级索引的结果 print(arr) # 输出: [10 99 30 40 50] (原始数组未被修改) print(fancy_arr) # 输出: [88 30 40] (高级索引的结果被修改)

4.2.4 高级索引的应用场景

高级索引在数据分析和科学计算中有很多应用场景,包括:

  • 数据过滤: 可以使用布尔数组索引来选择满足特定条件的元素。

  • 数据重塑: 可以使用整数数组索引来重新排列数组中的元素。

  • 图像处理: 可以使用高级索引来选择图像中的特定区域。

  • 机器学习: 可以使用高级索引来选择训练数据中的特定样本。

4.2.5 总结

NumPy 的高级索引提供了一种灵活而强大的数据访问机制。通过使用整数数组或布尔数组,可以轻松地选择 ndarray 中的特定元素,从而实现更复杂的数据操作。理解高级索引的工作原理以及它与切片的区别对于有效地使用 NumPy 至关重要。

通过本文的详细讲解和代码示例,相信你已经对 NumPy 的高级索引有了更深入的理解。在实际应用中,可以根据具体的需求选择合适的索引方式,从而更高效地处理数据。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U