numpy--1.4数组切片
获取x数组的一个切片:x[start : stop : step]
1.一维子数组
x = np.range(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(1)前五个元素
x[ : 5]
(2)索引五之后的元素
x[5 : ]
(3)中间的子数组
x[4 : 7]
(4)每隔一个元素
x[ : : 2]
(5)每隔一个元素,从索引1开始
x[1 : : 2] # array([1, 3, 5, 7, 9])
(6)所有元素,逆序
x[ : : -1] # array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
(7)从索引5开始每隔一个元素逆序
x[5 : : -2] # array([5, 3, 1])
2.多维子数组
多维切片也采用同样的方式,用逗号分割。
x2 = np.array([[7, 9, 2, 1],
[7, 3, 7, 5],
[1, 4, 0, 7]])
(1)两行,三列
x2[ : 2, : 3]
# array([[7, 9, 2],
# [7, 3, 7]])
(2)所有行,每隔一列
x2[ : 3, : : 2]
# array([[7, 2],
# [7, 7],
# [1, 0]])
(3)子数组也可以同时被逆序
x2[ : : -1, : : -1]
# array([[7, 0, 4, 1],
# [5, 7, 3, 7],
# [1, 2, 9, 7]])
3.获取数组的行和列
一种常见的需求是获取数组的单行和单列。可以将索引与切片组合起来实现这个功能,用一个冒号(:)表示空切片:
(1)x2的第一列
x2[ : , 0] # array([7, 7, 1])
(2)x2的第一行
x2[0, : ] # array([7, 9, 2, 1])
在获取时,出于语法的简洁考虑,可以省略空的切片:
x2[0] 等效于 x2[0, : ]
4.非副本视图的子数组
很重要的一点是,数组切片返回的是数组数据的视图,而不是数组数据的副本。这一点也是NumPy数组切片和Python列表切片的不同之处:在Python列表中,切片是值得副本。
这种默认的处理方式实际上非常有用:它意味着在处理非常大的数据集时,可以获取或处理这些数据集的片段,而不用复制底层的数据缓存。
5.创建数组的副本
可以通过copy()方法实现数组的复制:
x2_sub_copy = x2[ : 2, : 2].copy()