7索引与切片
数组索引机制指的是用方括号([])加序号的形式引用单个数组元素,它的用途很多,比如抽取元素,选取数组的几个元素,甚至为其赋一个新值
7.1整数索引
#要获取数组的单个元素,指定元素的索引即可。
x = np.array([1,2,3,4,5,6,7,8])
print(x[2])
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
print(x[2])
print('--'*5)
print(x[2][1])
print('--'*5)
print(x[2,1])
print('--'*5)
3
[21 22 23 24 25]
22
22
7.2切片索引
切片操作是指抽取数组的一部分元素生成新数组,对Python列表进行切片操作得到的数组是原数组的副本,而对Numpy数组进行切片操作得到的数组则是只想相同缓冲区的试图。
如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号(start:stop:step)隔开的数字置于方括号内。
- 如果省去第一个数字,numpy会认为地一个数字是0,
- 如果省去第二个数字,numpy会认为i第二个数字是数组的最大索引值,
- 如果省去最后一个数字,它将会被理解为1,也就是不用考虑步长
#对一维数组的切片
x = np.array([1,2,3,4,5,6,7,8])
print(x[0:2],"从索引0开始到索引2,但不含索引2")
print(x[1:5:2],"从索引1开始到索引5,但不含索引5,间隔为2进行切片")
print(x[2:],"从索引2开始到最大索引,进行切片")
print(x[:2],"前两个元素,等同于x[0:2:1]")
print(x[-2:],"从索引为-2,到最大索引,步长为1进行切片")
print(x[:-2],"从索引为0,到-2索引,步长为1进行切片")
print(x[:],"选取所有元素,等同于x[1:-1:1]")
print(x[::-1],"在python中,步长为1,从左往右切片,步长为-1,从右往左切片")
[1 2] 从索引0开始到索引2,但不含索引2
[2 4] 从索引1开始到索引5,但不含索引5,间隔为2进行切片
[3 4 5 6 7 8] 从索引2开始到最大索引,进行切片
[1 2] 前两个元素,等同于x[0:2:1]
[7 8] 从索引为-2,到最大索引,步长为1进行切片
[1 2 3 4 5 6] 从索引为0,到-2索引,步长为1进行切片
[1 2 3 4 5 6 7 8] 选取所有元素,等同于x[1:-1:1]
[8 7 6 5 4 3 2 1] 在python中,步长为1,从左往右切片,步长为-1,从右往左切片
#对二维数组进行切片
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
print(x[0:2],"选择x的前两行")
print('--'*5)
print(x[1:5:2],"选择x的第2行(索引为1),第4行(索引为3)")
print('--'*5)
print(x[2:],"选择x的第3,4,5行")
print('--'*5)
print(x[:2],"选择x的前两行")
print('--'*5)
print(x[:-2],"选择x的前3行")
print('--'*5)
print(x[:],"选择x的全部行")
print('--'*5)
print(x[2,:],"选择x第3行的全部元素")
print('--'*5)
print(x[:,2],"选择x的第3列全部元素")
print('--'*5)
print(x[0,1:4],"选择x的第一行中的中间三个元素")
print('--'*5)
print(x[1:4,0],"选择x中间三行的第一个元素")
print('--'*5)
print(x[1:3,2:4],"选择x的第2,3行的第3,4元素")
print('--'*5)
print(x[:,:],"选择x的所有元素")
print('--'*5)
print(x[::2,::2],"选择x的1,3,5行的1,3,5列的元素")
print('--'*5)
print(x[::-1,:],"反向选择x的所有行中的所有元素")
print('--'*5)
print(x[:,::-1],"翻转x的每一行")
[[11 12 13 14 15]
[16 17 18 19 20]] 选择x的前两行
----------
[[16 17 18 19 20]
[26 27 28 29 30]] 选择x的第2行(索引为1),第4行(索引为3)
----------
[[21 22 23 24 25]
[26 27 28 29 30]
[31 32 33 34 35]] 选择x的第3,4,5行
----------
[[11 12 13 14 15]
[16 17 18 19 20]] 选择x的前两行
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]] 选择x的前3行
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]
[31 32 33 34 35]] 选择x的全部行
----------
[21 22 23 24 25] 选择x第3行的全部元素
----------
[13 18 23 28 33] 选择x的第3列全部元素
----------
[12 13 14] 选择x的第一行中的中间三个元素
----------
[16 21 26] 选择x中间三行的第一个元素
----------
[[18 19]
[23 24]] 选择x的第2,3行的第3,4元素
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]
[31 32 33 34 35]] 选择x的所有元素
----------
[[11 13 15]
[21 23 25]
[31 33 35]] 选择x的1,3,5行的1,3,5列的元素
----------
[[31 32 33 34 35]
[26 27 28 29 30]
[21 22 23 24 25]
[16 17 18 19 20]
[11 12 13 14 15]] 反向选择x的所有行中的所有元素
----------
[[15 14 13 12 11]
[20 19 18 17 16]
[25 24 23 22 21]
[30 29 28 27 26]
[35 34 33 32 31]] 翻转x的每一行
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
print(x)
print('--'*5)
x[0::2,1::3] = 0#将x的第3、5行,第2,5列的元素赋值为0
print(x)
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]
[26 27 28 29 30]
[31 32 33 34 35]]
----------
[[11 0 13 14 0]
[16 17 18 19 20]
[21 0 23 24 0]
[26 27 28 29 30]
[31 0 33 34 0]]
7.2dots索引
NumPy允许使用…表示足够多的冒号来构建完整的索引列表。
比如,如果x是5维数组
- x[1,2,…]等于x[1,2,:,:,:]
- x[…,3]等于x[:,:,:,:,3]
- x[4,…,5,:]等于x[4,:,:,5,:]
x = np.random.randint(1,100,[2,2,3])#等于x = np.random.randint(1,100,(2,2,3)
'''
randint(low, high=None, size=None, dtype=int)
返回从“低”(包含)到“高”(排除)的随机整数。
数组的维度=len([2,2,3])
数组的元素=2×2×3
'''
print(x)
print('--'*5)
print(x[1,...])
print('--'*5)
print(x[...,2])
[[[22 22 73]
[99 78 44]]
[[99 65 52]
[97 8 55]]]
----------
[[99 65 52]
[97 8 55]]
----------
[[73 44]
[52 55]]
7.4整数数组索引
方括号内传入多个索引值,可以同时选择多个元素
x = np.array([1,2,3,4,5,6,7,8])
r = [0,1,2]
print(x[r])
print('--'*5)
r = [0,1,-1]
print(x[r])
print('--'*5)
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
r = [0,1,2]
print(x[r])
print('--'*5)
r = [0,1,-1]
print(x[r])
print('--'*5)
r = [0,1,2]
c = [2,3,4]
y = x[r,c]#相当于选择x[0,2]、x[1,3]、x[2,4]
print(y)
[1 2 3]
----------
[1 2 8]
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]]
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[31 32 33 34 35]]
----------
[13 19 25]
x = np.array([1,2,3,4,5,6,7,8])
r = np.array([[0,1],[3,4]])
print(x[r])
print('--'*5)
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
r = np.array([[0,1],[3,4]])
print(x[r])
print('--'*5)
# 获取5×5数组中的四个角的元素
# 行索引是[0,0]和[4,4],而列索引是[0,4]和[0,4]
r = np.array([[0,0],[4,4]])
c = np.array([[0,4],[0,4]])
y = x[r,c]
print(y)
[[1 2]
[4 5]]
----------
[[[11 12 13 14 15]
[16 17 18 19 20]]
[[26 27 28 29 30]
[31 32 33 34 35]]]
----------
[[11 15]
[31 35]]
#可以借助切片:与整数数组组合
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
y = x[0:3,[1,2,2]]
print(y)
[[12 13 13]
[17 18 18]
[22 23 23]]
numpy.take(a,indices,axis=None,out=None,mode=‘raise’)
x = np.array([1,2,3,4,5,6,7,8])
r = [0,1,2]
print(np.take(x,r))
print('--'*5)
r = [0,1,-1]
print(np.take(x,r))
print('--'*5)
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
r = [0,1,2]
print(np.take(x,r,axis=0))
print('--'*5)
r = [0,1,-1]
print(np.take(x,r,axis=0))#选择行
print('--'*5)
r = [0,1,2]
c = [2,3,4]
y = np.take(x,[r,c])
print(y)
print('--'*5)
print(np.take(x,r,axis=1))
[1 2 3]
----------
[1 2 8]
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25]]
----------
[[11 12 13 14 15]
[16 17 18 19 20]
[31 32 33 34 35]]
----------
[[11 12 13]
[13 14 15]]
----------
[[11 12 13]
[16 17 18]
[21 22 23]
[26 27 28]
[31 32 33]]
7.5布尔索引
我们可以通过一个布尔数组来索引目标数组
x = np.array([1,2,3,4,5,6,7,8])
y = x > 5
print(y)
print(x[y])
x = np.array([np.nan,1,2,np.nan,3,4,5])
y = np.logical_not(np.isnan(x))
print(x[y])
x = np.array([[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25],
[26,27,28,29,30],
[31,32,33,34,35]])
y = x > 5
print(y)
print(x[x > 25])
[False False False False False True True True]
[6 7 8]
[1. 2. 3. 4. 5.]
[[ True True True True True]
[ True True True True True]
[ True True True True True]
[ True True True True True]
[ True True True True True]]
[26 27 28 29 30 31 32 33 34 35]
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,50)
y = np.sin(x)
print(len(x))
plt.plot(x,y)
mask = y >= 0
print(len(x[mask]))
print(mask)
plt.plot(x[mask],y[mask],'bo')
mask = np.logical_and(y >= 0,x <= np.pi/2)
print(mask)
plt.plot(x[mask],y[mask],'go')
plt.show()
50
25
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False]
[ True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False]