首页 > 编程笔记 > Python笔记 阅读:15

NumPy索引和切片详解(附带实例)

NumPy 数组元素是通过数组的索引和切片来访问和修改的,因此索引和切片是 NumPy 中最重要、最常用的概念。

NumPy索引

所谓数组的索引,是用于标记数组中对应元素的唯一数字,从 0 开始,即数组中的第一个元素的索引是 0,以此类推。NumPy 数组可以使用标准 Python 语法 x[obj] 来标记索引,其中 x 是数组,obj 是索引。

【实例】获取一维数组 n1 中索引为 0 的元素,程序代码如下:
import numpy as np  # 导入numpy模块
n1=np.array([1,2,3])  # 创建一维数组
print(n1[0])         # 输出一维数组中的第一个元素
运行程序,结果为:

1


【实例】通过索引获取二维数组中的元素,程序代码如下:
import numpy as np  # 导入numpy模块
n1=np.array([[1,2,3],[4,5,6]])
print(n1[1][2])     # 输出二维数组中第2行第3列的元素
运行程序,结果为:

6

NumPy切片式索引

数组切片可以理解为对数组的分割,按照等分或者不等分原则,将一个数组分割为多个片段,它与 Python 中列表的切片操作一样。

NumPy 中用冒号分隔切片参数来进行切片操作,语法格式如下:

[start:stop:step]

参数说明:
【实例】实现简单的切片操作,对数组 n1 进行切片式索引,如下图所示。


图 1 切片式索引示意图

程序代码如下:
import numpy as np  # 导入numpy模块
n1=np.array([1,2,3])  # 创建一维数组
print(n1[0])         # 输出第1个元素
print(n1[1])         # 输出第2个元素
print(n1[0:2])       # 输出第1个元素至第3个元素(不包括第3个元素)
print(n1[1:])        # 输出从第2个元素开始以后的元素
print(n1[::2])       # 输出第1个元素(0省略)至第4个元素(不包括第4个元素)
运行程序,结果如下:

1
2
[1 2]
[2 3]
[1 3]

切片式索引操作需要注意以下几点:

图 2 反向索引示意图

【实例】常用的切片式索引操作程序代码如下:
import numpy as np  # 导入numpy模块
n = np.arange(10)   # 使用arange()函数创建一维数组
print(n)           # 输出一维数组
print(n[:3])       # 输出第1个元素(0省略)至第4个元素(不包括第4个元素)
print(n[3:6])      # 输出第4个元素至第7个元素(不包括第7个元素)
print(n[6:])       # 输出第7个元素至最后一个元素
print(n[::-1])     # 输出所有元素
print(n[::1])      # 输出第1个元素至最后一个元素
print(n[:2])       # 输出第1个元素至最后一个元素,以5为步长
print(n[1::5])     # 输出第2个元素至最后一个元素,以5为步长
print(n[2::6])     # 输出第3个元素至最后一个元素,以6为步长
# start、stop、step为负数时
print(n[::-1])     # 输出所有元素且步长是-1
print(n[-3::-1])   # 输出倒数第3个元素至倒数第1个元素(不包括倒数第3个元素)
print(n[-3:-5:-1]) # 输出倒数第3个元素至倒数第5个元素且步长是-1
print(n[-5::-1])   # 输出倒数第5个元素至最后一个元素且步长是-1
运行程序,结果为:

[0 1 2 3 4 5 6 7 8 9]
[0 1 2]
[3 4 5]
[6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]
[1 6]
[2 8]
[9 8 7 6 5 4 3 2 1 0]
[9 8]
[7 6]
[5 4 3 2 1 0]

NumPy二维数组索引

二维数组索引可以使用 array[n, m] 的方式表示,以逗号分隔,表示第 n 个数组的第 m 个元素。

【实例】创建一个 3 行 4 列的二维数组,实现简单的索引操作,效果如下图所示。


图 3 二维数组索引示意图

程序代码如下:
import numpy as np  # 导入numpy模块
# 创建3行4列的二维数组
n=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
print(n[1])        # 输出第2行的元素
print(n[1,2])      # 输出第2行第3列的元素
print(n[-1])       # 输出倒数第1行的元素
运行程序,结果如下:

[4 5 6 7]
6
[8 9 10 11]

在上述代码中,n[1] 表示第 2 行;n[1, 2] 表示第 2 行第 3 列的元素,它等同于 n[1][2],实际上 n[1][2]的操作原理是先通过索引确定第一个维度得到一个数组,然后在此基础上再进行索引确定元素。

NumPy二维数组切片式索引

【实例】创建一个二维数组,实现各种切片式索引操作,效果如下图所示:


图 4 二维数组切片式索引示意图

程序代码如下:
import numpy as np  # 导入numpy模块
# 创建3行3列的二维数组
n=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(n[:2,1:])     # 输出第1行至第3行(不包括第3行)的第2列至最后一列的元素
print(n[1,:2])      # 输出第2行的第1列至第3列(不包括第3列)的元素
print(n[:2,2])      # 输出第1行至第3行(不包括第3行)的第3列的元素
print(n[:,1:])      # 输出所有行的第1列至第2列(不包括第2列)的元素
运行程序,结果如下:

[[2 3]
[5 6]]
[4 5]
[3 6]
[[1]
[4]
[7]]

相关文章