10月numpy学习2

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维数组

  1. x[1,2,…]等于x[1,2,:,:,:]
  2. x[…,3]等于x[:,:,:,:,3]
  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]

/home/mcq/下载/Task2/output_27_1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值