第四章:ndarray 的索引、切片和迭代


文档摘要

第四章:ndarray 的索引、切片和迭代 第四章:ndarray 的索引、切片和迭代 NumPy的核心是ndarray(n-dimensional array),一个高效的多维数组对象。访问和操作ndarray中的元素是数据处理的关键。本章将深入探讨ndarray的索引、切片和迭代,这些是NumPy中进行数据选择和处理的基础。 索引 (Indexing) 索引允许你访问ndarray中的单个元素。NumPy的索引从0开始,与Python列表类似。 1.1 一维数组的索引 对于一维数组,索引非常直接: 1.2 多维数组的索引 多维数组的索引使用逗号分隔的索引元组。每个索引对应于数组的一个维度。 图示:多维数组索引 1.3 布尔索引 布尔索引允许你根据条件选择数组中的元素。

第四章:ndarray 的索引、切片和迭代

第四章:ndarray 的索引、切片和迭代

NumPy的核心是ndarray(n-dimensional array),一个高效的多维数组对象。访问和操作ndarray中的元素是数据处理的关键。本章将深入探讨ndarray的索引、切片和迭代,这些是NumPy中进行数据选择和处理的基础。

1. 索引 (Indexing)

索引允许你访问ndarray中的单个元素。NumPy的索引从0开始,与Python列表类似。

1.1 一维数组的索引

对于一维数组,索引非常直接:

import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr[0]) # 输出:1 print(arr[3]) # 输出:4 print(arr[-1]) # 输出:5 (负索引,从末尾开始计数)

1.2 多维数组的索引

多维数组的索引使用逗号分隔的索引元组。每个索引对应于数组的一个维度。

arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr[0, 0]) # 输出:1 (第一行,第一列) print(arr[1, 2]) # 输出:6 (第二行,第三列) print(arr[0]) # 输出:[1 2 3] (第一行)

图示:多维数组索引

1.3 布尔索引

布尔索引允许你根据条件选择数组中的元素。你需要创建一个与原数组形状相同的布尔数组,其中True表示选择该位置的元素,False表示不选择。

arr = np.array([1, 2, 3, 4, 5]) bool_arr = arr > 2 print(bool_arr) # 输出:[False False True True True] print(arr[bool_arr]) # 输出:[3 4 5] print(arr[arr > 2]) # 输出:[3 4 5] (更简洁的写法)

1.4 花式索引 (Fancy Indexing)

花式索引允许你使用整数数组作为索引来选择ndarray中的元素。这可以实现更灵活的元素选择。

arr = np.array([10, 20, 30, 40, 50]) index_arr = np.array([0, 2, 4]) print(arr[index_arr]) # 输出:[10 30 50]

对于多维数组,花式索引可以更复杂:

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_indices = np.array([0, 2]) col_indices = np.array([1, 2]) print(arr[row_indices, col_indices]) # 输出:[2 9] (选取 (0,1) 和 (2,2) 位置的元素)

需要注意的是,arr[row_indices, col_indices] 选取的是 (0,1)(2,2) 这两个位置的元素,而不是选取第0行和第2行,以及第1列和第2列的交叉部分。 如果需要选取交叉部分,可以使用 np.ix_ 函数。

print(arr[np.ix_(row_indices, col_indices)]) # 输出: # [[2 3] # [8 9]]

2. 切片 (Slicing)

切片允许你选择ndarray中的一个连续区域。切片使用start:stop:step语法,类似于Python列表的切片。

2.1 一维数组的切片

arr = np.array([1, 2, 3, 4, 5, 6]) print(arr[1:5]) # 输出:[2 3 4 5] (从索引1开始,到索引5之前结束) print(arr[:3]) # 输出:[1 2 3] (从索引0开始,到索引3之前结束) print(arr[3:]) # 输出:[4 5 6] (从索引3开始,到数组末尾) print(arr[::2]) # 输出:[1 3 5] (从索引0开始,每隔一个元素) print(arr[::-1]) # 输出:[6 5 4 3 2 1] (反转数组)

2.2 多维数组的切片

多维数组的切片在每个维度上使用切片语法。

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr[:2, 1:]) # 输出:[[2 3] [5 6]] (选取前两行,从第二列开始的所有列) print(arr[1:, :2]) # 输出:[[4 5] [7 8]] (选取从第二行开始的所有行,前两列) print(arr[:, 0]) # 输出:[1 4 7] (选取所有行的第一列)

图示:多维数组切片

2.3 切片的修改

需要特别注意的是,NumPy的切片是视图(view),而不是副本(copy)。这意味着修改切片会影响原始数组。

arr = np.array([1, 2, 3, 4, 5]) slice_arr = arr[1:4] slice_arr[:] = 0 # 修改切片的所有元素 print(slice_arr) # 输出:[0 0 0] print(arr) # 输出:[1 0 0 0 5] (原始数组也被修改了)

如果需要创建切片的副本,可以使用.copy()方法:

arr = np.array([1, 2, 3, 4, 5]) slice_arr = arr[1:4].copy() slice_arr[:] = 0 print(slice_arr) # 输出:[0 0 0] print(arr) # 输出:[1 2 3 4 5] (原始数组未被修改)

3. 迭代 (Iteration)

迭代允许你遍历ndarray中的每个元素。NumPy提供了多种迭代方式。

3.1 一维数组的迭代

对于一维数组,迭代非常简单:

arr = np.array([1, 2, 3, 4, 5]) for element in arr: print(element)

3.2 多维数组的迭代

对于多维数组,默认情况下迭代会遍历第一个维度(通常是行):

arr = np.array([[1, 2, 3], [4, 5, 6]]) for row in arr: print(row)

要遍历多维数组中的每个元素,可以使用flat属性或nditer对象。

3.3 使用 flat 属性迭代

flat属性返回一个迭代器,可以遍历数组中的每个元素,就像它是一个一维数组一样。

arr = np.array([[1, 2, 3], [4, 5, 6]]) for element in arr.flat: print(element)

3.4 使用 nditer 对象迭代

nditer对象是一个更灵活的迭代器,可以控制迭代的顺序和方式。

arr = np.array([[1, 2, 3], [4, 5, 6]]) for element in np.nditer(arr): print(element)

nditer对象还支持多种迭代选项,例如:

  • order: 指定迭代顺序('C':行优先,'F':列优先,'A':自动,'K':保持内存布局)。

  • flags: 控制迭代行为(例如,'external_loop'将迭代器分成多个小块)。

  • op_flags: 控制如何处理迭代的数组(例如,'readwrite'允许修改数组)。

arr = np.array([[1, 2], [3, 4]]) # 列优先迭代 for element in np.nditer(arr, order='F'): print(element) # 修改数组的元素 for element in np.nditer(arr, op_flags=['readwrite']): element[...] = element * 2 print(arr) # 输出:[[2 4] [6 8]]

图示:ndarray 迭代

4. 总结

ndarray的索引、切片和迭代是NumPy中进行数据访问和操作的基本工具。理解这些概念对于高效地使用NumPy至关重要。

  • 索引允许你访问ndarray中的单个元素。

  • 切片允许你选择ndarray中的一个连续区域,并创建原始数组的视图。

  • 迭代允许你遍历ndarray中的每个元素,flat 属性和 nditer 对象提供了灵活的迭代方式。

通过掌握这些技术,你可以更有效地处理和分析NumPy数组中的数据。


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