索引与切片
numpy中数组索引机制指的是用方括号([])加序号的形式引用单个数组元素,它的用处很多,比如抽取元素,选取数组的几个元素,甚至为其赋一个新值。
整数索引
import numpy as np
x = np.array([1,2,3,4,5,6])
print(x[2])
x = np.array([[21,22,23,24,25],
[26,27,28,29,30],
[11,12,13,14,15],
[16,17,18,19,20]])
print(x[2])
print(x[2][1])
print(x(2,1))
# 3
# [11 12 13 14 15]
# 12
切片索引
切片操作是指抽取数组的一部分元素生成新数组。对 python 列表进行切片操作得到的数组是原数组的副本,而对 Numpy 数据进行切片操作得到的数组则是指向相同缓冲区的视图。
如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号( start:stop:step )隔开的数字置于方括号内。
为了更好地理解切片语法,还应该了解不明确指明起始和结束位置的情况。如省去第一个数字,numpy 会认为第一个数字是0;如省去第二个数字,numpy 则会认为第二个数字是数组的最大索引值;如省去最后一个数字,它将会被理解为1,也就是抽取所有元素而不再考虑间隔。
#对于二维数组切片
import numpy as np
x = np.array([[50,51,52,53,54],
[60,61,62,63,64],
[70,71,72,73,74],
[80,81,82,83,84],
[90,91,92,93,94]])
print(x[0:2])
# [[50 51 52 53 54]
# [60 61 62 63 64]]
print(x[2:])
# [[70 71 72 73 74]
# [80 81 82 83 84]
# [90 91 92 93 94]]
print(x[:])
# [[50 51 52 53 54]
# [60 61 62 63 64]
# [70 71 72 73 74]
# [80 81 82 83 84]
# [90 91 92 93 94]]
print(x[:,2])
# [52 62 72 82 92]
print(x[1:3,2:4])
# [[62 63]
# [72 73]]
print(x[::1,:])
# [[50 51 52 53 54]
# [60 61 62 63 64]
# [70 71 72 73 74]
# [80 81 82 83 84]
# [90 91 92 93 94]]
dots索引
NumPy 允许使用 ...
表示足够多的冒号来构建完整的索引列表。
比如,如果 x
是 5 维数组:
x[1,2,...]
等于x[1,2,:,:,:]
x[...,3]
等于x[:,:,:,:,3]
x[4,...,5,:]
等于x[4,:,:,5,:]
实例:
import numpy as np
x = np.random.randint(1, 500, [2, 1, 3])
print(x)
# [[[447 355 418]]
#
# [[ 64 384 98]]]
print(x[1,...])
# [[188 154 294]]
print(x[...,2])
# [[328]
# [332]]
整数数组索引
import numpy as np
x = np.array([1,2,3,4,5,6,7,8])
r = [0,1,2]
print(x[r])
# [1 2 3]
布尔索引
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x > 5
print(y)
# [False False False False False True True True]
print(x[x > 5])
# [6 7 8]
x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
y = np.logical_not(np.isnan(x))
print(x[y])
# [1. 2. 3. 4. 5.]
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
print(len(x)) # 50
plt.plot(x, y)
mask = y >= 0
print(len(x[mask])) # 25
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()