NumPy数组的索引、切片和遍历
附加小知识:
本篇文章将会涉及到三维数组,特此做出以下补充:
我们可以将三维数组想象成为一个立方体,第一维度理解为立方体的长,第二维度理解为宽,彩色图片是3通道的,所以第三维“图片通道”想象成深度。用立方体中直观展示:
通过 np.zeros( ) 创建一个2行4列3个通道的三维数组,并给第1行第2列第1通道赋值为1。
得到以下结果:
[[[0 0 0]
[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 1 0]
[0 0 0]]]
通过观察数值(2,4,3)可以理解:这里的2行变成了2个“更大规模的行”,4列变成了4个“行”,3通道变成了3个“列”。
其实我是这样记得:行就是多少行也就是大规模的行,列就是列,而通道就是[[[ 连起来最多有几个。
该文参考的原博文:
原文链接:https://blog.csdn.net/qq_37233260/article/details/119337233
更全面的理解可以了解博文
原文链接:https://blog.csdn.net/vswyh/article/details/118068454
1 索引
# 引入NumPy
import numpy as np
2 正索引
# 一维数组
arr = np.array([4, 3, 8, 6])#创建一维数组arr
print(arr[0]) #输出arr数组的第一个元素
print(arr[3]) #输出arr数组的第四个元素
print(arr[[1,3]]) #!输出arr数组第二个和第四个元素
4
6
[3 6]
# 二维数组
arr = np.arange(12).reshape((3, 4))#创建一维数组后转化为3×4数组
print(arr) #输出arr
print(arr[1]) #输出arr数组的第二行
print(arr[2]) #输出arr数组的第三行
print(arr[2, 2]) #!!输出arr数组的第三行第三列的元素
print(arr[[1,2], [0, 2]]) #!!输出arr数组的第二行第三列的元素和第一行第三列的元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[4 5 6 7]
[ 8 9 10 11]
10
[ 4 10]
3 负索引
# 一维数组
arr = np.array([4, 3, 8, 6])#创建一维数组arr
print(arr[-1]) #输出arr数组倒数第一个元素
print(arr[-2]) #输出arr数组倒数第二个元素
6
8
# 二维数组
arr = np.arange(12).reshape((3, 4))#创建一维数组后转化为3×4数组
print(arr) #输出数组
print(arr[-1]) #输出数组倒数第一行元素
print(arr[-2]) #输出数组倒数第二行元素
print(arr[-2, -2]) #输出数组倒数第二行倒数第二列的元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ 8 9 10 11]
[4 5 6 7]
6
4 正负索引混合使用
# 三维数组
arr = np.arange(12).reshape((3, 2, 2))#创建一维数组后转化为三维数组
print(arr) #输出arr数组
print(arr[1, -1, -2]) #输出第二维数组倒数第一行倒数第二列的元素
[[[ 0 1]
[ 2 3]]
[[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]]]
6
5 索引越界
arr = np.arange(5)#创建一维数组arr
print(arr) #输出arr数组
print(arr[8]) #输出arr数组倒数第五个元素 (会报错)
[0 1 2 3 4]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-14-0ea15dfe446f> in <module>
1 arr = np.arange(5)#创建一维数组arr
2 print(arr) #输出arr数组
----> 3 print(arr[8]) #输出arr数组倒数第五个元素 (会报错)
IndexError: index 8 is out of bounds for axis 0 with size 5
6 通过索引修改数据
# 遍历
arr = np.array([4, 5, 2, 6])#创建一维数组arr
print(arr) #输出arr数组
arr[0] = 10 #将arr数组第一个元素重新赋值为10
print(arr) #输出arr数组
[4 5 2 6]
[10 5 2 6]
7 切片
numpy.random.randint()函数可以返回一个随机整型数,范围从低[low,high),其主要参数如下:
low:生成的数值最低要大于等于low,整数
high:生成的数值最低要小于high,整数(可选)
size:输出随机数的尺寸,整数或整数序列
arr = np.random.randint(low=1, high=100, size=10)#创建一个随机的数组arr
print(arr) #输出arr数组
print(arr[1:5]) #输出arr数组第二个到第五个的元素,数组左闭右开,取不到右边的数
print(arr[:3]) #输出数组前三个元素
print(arr[6:]) #输出数组第七个元素后的全部元素
print(arr[::-1]) #逆序输出数组
print(arr[1:8:2]) #输出数组第二个元素到第八个元素之间步长为2 的元素
[88 34 66 40 69 60 42 77 5 32]
[34 66 40 69]
[88 34 66]
[42 77 5 32]
[32 5 77 42 60 69 40 66 34 88]
[34 40 60 77]
arr = np.arange(24).reshape((4, 6))#创建一个4×6的数组arr
print(arr) #输出arr数组
print(arr[:3, 4:]) #输出前三行和后两列相交的元素
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 4 5]
[10 11]
[16 17]]
# 一维数组,直接遍历获得元素
arr = np.array([8, 4, 6, 1])#创建数组arr
print(arr) #输出arr数组
for ele in arr: #循环遍历arr中的每一行
print(ele) #输出元素
[8 4 6 1]
8
4
6
1
# 二维及以上高维数组,从最外层遍历
arr = np.arange(12).reshape((3, 4))#创建一个3×4的数组arr
print(arr) #输出arr数组
for row in arr: #循环遍历arr中的每一行
print(row) #输出每一行的元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[0 1 2 3]
[4 5 6 7]
[ 8 9 10 11]
# 高维数组遍历所有元素
arr = np.arange(12).reshape((3, 4))#创建一个3×4的数组arr
print(arr) #输出arr数组
for row in arr: #遍历数组的每一行
for col in row: #遍历每一行的所有元素
print(col) #输出元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
0
1
2
3
4
5
6
7
8
9
10
11
flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
# 高维数组遍历所有元素
arr = np.arange(12).reshape((3, 4))#创建一个3×4的数组arr
print(arr) #输出arr数组
for ele in arr.flat: #遍历arr数组的每一个元素
print(ele) #输出元素
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
0
1
2
3
4
5
6
7
8
9
10
11