用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

Logo

更多推荐