Numpy学习笔记004
六、数组的索引和切片
jupyter notebook
环境
1.一维数组的索引和切片
import numpy as np
a1 = np.arange(2,19)
print(a1[1]) #获取下标为1的元素
print("="*30)
#切片
print(a1[:]) #取数组中所有数
print("="*30)
print(a1[1:4]) #取左不取右
print("="*30)
print(a1[2:6:2]) # [开始索引:结束索引 : 步长 ],这三个参数都可以省略,步长默认为1
3
==============================
[ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
==============================
[3 4 5]
==============================
[4 6]
2.多维数组的索引和切片
也是通过中括号来索引,在中括号中,使用逗号进行分割,逗号前是行,后是列,如果只有一个值则为行。
注意:数组的行和列的下标都是从0开始,这里假设下标为0处为第1列或第1行。
2.1 获取行
a2 = np.random.randint(0,10,size=(4,6)) # 元素是从0-10之间随机的4行6列的数组
print(a2)
print("="*20)
print(a2[0]) #获取第一行
print("="*20)
print(a2[1:3]) #获取第二和第三行
print("="*20)
print(a2[[0,2,3]]) #获取第一、三、四行
某次结果如下:
[[2 8 4 4 5 3]
[3 7 6 1 7 7]
[2 6 7 7 8 4]
[5 6 7 9 4 0]]
====================
[2 8 4 4 5 3]
====================
[[3 7 6 1 7 7]
[2 6 7 7 8 4]]
====================
[[2 8 4 4 5 3]
[2 6 7 7 8 4]
[5 6 7 9 4 0]]
2.2 获取列
a2 = np.random.randint(0,10,size=(4,6)) # 元素是从0-10之间随机的4行6列的数组
print(a2)
print("="*20)
#获取某一列
print(a2[ : ,2]) # 所有行,第三列(结果是从左到右排布,但还是列)
print("="*20)
print(a2[ : ,1:3]) #所有行,第二列到第四列(取左不取右)
print("="*20)
print(a2[ : ,[1,3]]) #所有行,第二和第四列
print("="*20)
[[3 7 1 7 8 9]
[5 2 4 4 6 0]
[3 0 1 1 1 2]
[6 3 6 7 9 3]]
====================
[1 4 1 6]
====================
[[7 1]
[2 4]
[0 1]
[3 6]]
====================
[[7 7]
[2 4]
[0 1]
[3 7]]
2.3 获取值
a2 = np.random.randint(0,10,size=(4,6)) # 元素是从0-10之间随机的4行6列的数组
print(a2)
print("="*20)
#获取某个数据
print(a2[1,3]) #第2行第三列(行和列下标都是从0开始,假设下标为0处为第1列或第1行)
print("="*20)
print(a2[[1,2],[2,3]])
print("="*20)
print(a2[1:3,2:4]) #行列满足第一行或第二行,第二列或第三列
[[7 2 1 1 5 0]
[0 9 0 1 0 1]
[6 1 6 6 5 2]
[7 0 7 6 4 0]]
====================
1
====================
[0 6]
====================
[[0 1]
[6 6]]
3.布尔索引
a3 = np.arange(0,24).reshape((4,6)) #重新修改数组的维数,修改后的数组数量要和原来的一致
print(a3)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
a3 < 10
结果返回布尔值组成的数组:
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, False, False, False, False],
根据布尔值取出数据
a3[a3<10] #将所有布尔值为True(即满足a3<10)的值取出
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a3[(a3<5) | (a3>10)] #取出a3<5或a3>10的数
array([ 0, 1, 2, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23])
4.值的替换
a4 = np.arange(0,30).reshape((5,6))
print(a4)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]]
4.1 将第三行的所有值都替换成0
a4[3] = 0
print(a4)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[ 0 0 0 0 0 0]
[24 25 26 27 28 29]]
4.2 将小于10的所有值全部都替换成2
a4变为4.1的结果
a4[a4<10] = 2
print(a4)
[[ 2 2 2 2 2 2]
[ 2 2 2 2 10 11]
[12 13 14 15 16 17]
[ 2 2 2 2 2 2]
[24 25 26 27 28 29]]
4.3 使用函数来实现
a4变为4.2的结果
a4 = np.where(a4<10,1,0) #把a4中所有小于10的数全部变成1,其余的变成0
print(a4)
[[1 1 1 1 1 1]
[1 1 1 1 0 0]
[0 0 0 0 0 0]
[1 1 1 1 1 1]
[0 0 0 0 0 0]]