19、NumPy数组的索引和切片操作【用Python进行AI数据分析进阶教程】
摘要:本文介绍了Python中NumPy库的数组索引和切片操作。索引用于访问单个元素,从0开始计数;切片用于提取子数组,可指定起始索引、结束索引和步长。一维数组通过单个整数索引访问,多维数组需多个索引值。支持负数索引,切片结果为视图,非副本,修改视图会影响原数组。需注意索引越界、步长为负数时的方向反转及视图与副本的区别。通过实例展示了索引和切片在一维及多维数组中的应用。
用Python进行AI数据分析进阶教程19:NumPy数组的索引和切片操作
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
关键词:NumPy数组、索引、切片、视图、副本
摘要:本文介绍了Python中NumPy库的数组索引和切片操作。索引用于访问单个元素,从0开始计数;切片用于提取子数组,可指定起始索引、结束索引和步长。一维数组通过单个整数索引访问,多维数组需多个索引值。支持负数索引,切片结果为视图,非副本,修改视图会影响原数组。需注意索引越界、步长为负数时的方向反转及视图与副本的区别。通过实例展示了索引和切片在一维及多维数组中的应用。
在 Python 的 NumPy 库中,数组的索引和切片操作是对数组元素进行访问、提取和修改的重要方式。以下是关于 NumPy 数组索引和切片操作的概念、关键点、注意点及举例说明:
一、概念
1、索引:
通过指定数组中元素的位置(下标)来访问单个元素。在 NumPy 数组中,索引从 0 开始计数,对于多维数组,需要使用多个索引值来确定元素的位置。
2、 切片:
通过指定起始索引、结束索引(可选)和步长(可选)来提取数组的一个子数组。切片操作可以用于一维数组、二维数组甚至更高维度的数组,能够方便地获取数组的一部分数据。
二、关键点
1、一维数组的索引和切片:
● 索引:使用一个整数索引来访问元素,如 arr[0] 表示访问数组 arr 的第一个元素。
● 切片:使用 arr[start:stop:step] 的形式, start 是起始索引(包含), stop 是结束索引(不包含), step 是步长(默认为 1)。例如, arr[1:4] 表示从索引 1 开始(包含)到索引 4 之前(不包含)的元素。
2、多维数组的索引和切片:
● 索引:对于二维数组,需要两个索引值,如 arr[i, j] 表示访问第 i 行第 j 列的元素;对于更高维度的数组,依此类推。
● 切片:多维数组的切片可以对每个维度分别进行操作,如 arr[1:3, 2:5] 表示在二维数组中取第 1 行到第 2 行(不包含第 3 行),第 2 列到第 4 列(不包含第 5 列)的子数组。
负数索引:可以使用负数索引, -1 表示数组的最后一个元素, -2 表示倒数第二个元素,以此类推。在切片中使用负数索引也遵循类似规则。
切片的结果是视图:在 NumPy 中,切片操作返回的是原数组的一个视图,而不是一个新的数组副本。这意味着对视图的修改会反映到原数组上。
三、注意点
● 索引越界:当使用的索引值超出数组的范围时,会抛出 IndexError 异常。因此,在进行索引操作时,要确保索引值在有效的范围内。
● 切片的步长:当步长为负数时,切片的方向会反转。例如, arr[::-1] 会将数组 arr 反转。
● 视图与副本的区别:由于切片返回的是视图,在某些情况下,如果不希望对原数组产生影响,需要使用 copy() 方法创建一个副本。例如, new_arr = arr.copy() 会创建 arr 的一个独立副本。
● 多维数组的索引顺序:在多维数组中,索引的顺序要与数组的维度顺序一致,否则可能会得到错误的结果。
四、举例说明
1、一维数组的索引和切片:
Python脚本
# 导入 NumPy 库,并将其重命名为 np,方便后续使用
import numpy as np
# 使用 NumPy 的 array 函数创建一个一维数组
# 该数组包含元素 10、20、30、40 和 50
arr = np.array([10, 20, 30, 40, 50])
# 通过索引访问数组 arr 中索引为 2 的元素
# 在 Python 中,索引从 0 开始,所以索引 2 对应的是数组中的第 3 个元素
# 打印该元素的值
print(arr[2]) # 输出 30,访问索引为 2 的元素
# 使用切片操作获取数组 arr 中索引从 1 到 4(不包含 4)的元素
# 切片操作返回一个新的数组,包含指定范围内的元素
# 打印切片后的数组
print(arr[1:4]) # 输出 [20 30 40],切片操作
# 使用切片操作获取数组 arr 中从开头到结尾,步长为 2 的元素
# 步长为 2 表示每隔一个元素取一个
# 打印切片后的数组
print(arr[::2]) # 输出 [10 30 50],步长为 2 的切片
# 使用切片操作获取数组 arr 中从结尾到开头,步长为 -1 的元素
# 步长为 -1 表示反转数组元素的顺序
# 打印反转后的数组
print(arr[::-1]) # 输出 [50 40 30 20 10],反转数组
2、二维数组的索引和切片:
python脚本
# 导入 NumPy 库,并将其重命名为 np,方便后续代码调用 NumPy 中的函数和对象
import numpy as np
# 使用 NumPy 的 array 函数创建一个二维数组 arr_2d
# 该二维数组由三个一维数组组成,可看作是一个 3 行 3 列的矩阵
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 访问二维数组 arr_2d 中指定位置的元素
# 第一个索引 1 表示选取第 2 行(索引从 0 开始计数)
# 第二个索引 2 表示选取该行中的第 3 列元素
# 打印出该位置的元素值
print(arr_2d[1, 2]) # 输出 6,访问第 1 行第 2 列的元素
# 对二维数组 arr_2d 进行切片操作
# 第一个切片 0:2 表示选取第 1 行和第 2 行(不包含索引为 2 的行)
# 第二个切片 1:3 表示选取这些行中的第 2 列和第 3 列(不包含索引为 3 的列)
# 打印出切片后得到的子数组
print(arr_2d[0:2, 1:3])
# 输出 [[2 3]
# [5 6]],取第 0 行到第 1 行,第 1 列到第 2 列的子数组
# 对二维数组 arr_2d 进行切片操作
# 第一个切片 : 表示选取所有行
# 第二个索引 1 表示选取所有行中的第 2 列元素
# 打印出切片后得到的一维数组,该数组包含原二维数组中第 2 列的所有元素
print(arr_2d[:, 1]) # 输出 [2 5 8],取第 1 列的所有元素
3、视图与副本的示例:
python脚本
# 导入 NumPy 库并将其重命名为 np,以便后续使用 NumPy 提供的功能
import numpy as np
# 使用 NumPy 的 array 函数创建一个一维数组 arr,数组包含元素 1、2、3、4、5
arr = np.array([1, 2, 3, 4, 5])
# 对数组 arr 进行切片操作,获取从索引 1 到索引 3(不包含索引 3)的元素
# 这里得到的 view 是原数组 arr 的一个视图,它和原数组共享底层数据
# 也就是说,对 view 的修改会反映到原数组 arr 上
view = arr[1:3]
# 修改 view 中索引为 0 的元素的值为 100
# 由于 view 是 arr 的视图,所以原数组 arr 中对应位置的元素也会被修改
view[0] = 100
# 打印原数组 arr,此时可以看到 arr 中对应位置的元素已被修改
print(arr) # 输出 [ 1 100 100 4 5],原数组也被修改
# 使用数组的 copy 方法创建原数组 arr 的一个副本 copy_arr
# 副本是一个独立的数组,它和原数组 arr 不共享底层数据
# 对 copy_arr 的修改不会影响原数组 arr
copy_arr = arr.copy()
# 修改副本 copy_arr 中索引为 0 的元素的值为 0
# 由于 copy_arr 是独立的,所以原数组 arr 不会受到影响
copy_arr[0] = 0
# 打印原数组 arr,验证其值未因对 copy_arr 的修改而改变
print(arr) # 输出 [ 1 100 100 4 5],原数组不受副本修改的影响
# 打印副本 copy_arr,查看修改后的结果
print(copy_arr) # 输出 [ 0 100 100 4 5]
通过以上介绍和示例,你可以更好地理解和掌握 NumPy 数组的索引和切片操作。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589
更多推荐
所有评论(0)