ndarray支持在多维数组上的切片操做。为了方便起见,咱们能够用一个省略号(...)来
表示遍历剩下的维度。
(1) 举例来讲,咱们先用arange函数建立一个数组并改变其维度,使之变成一个三维数组:数组
b=np.arange(24).reshape(2,3,4)
b.shape
(2L, 3L, 4L)
b
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
多维数组b中有0~23的整数,共24个元素,是一个2×3×4的三维数组。咱们能够形象地把它看作一个两层楼建筑,每层楼有12个房间,并排列成3行4列。或者,咱们也能够将其当作是电子表格中工做表(sheet)、行和列的关系。你可能已经猜到,reshape函数的做用是改变数组的“形状”,也就是改变数组的维度,其参数为一个正整数元组,分别指定数组在每一个维度上的大小。若是指定的维度和数组的元素数目不相吻合,函数将抛出异常。
(2)咱们能够用三维坐标来选定任意一个房间,即楼层、行号和列号。例如,选定第1层楼、第1行、第1列的房间(也能够说是第0层楼、第0行、第0列,这只是习惯问题),能够这样表示:
b[0,0,0]
0函数
(3) 若是咱们不关心楼层,也就是说要选取全部楼层的第1行、第1列的房间,那么能够将第1
个下标用英文标点的冒号:来代替:code
b[:,0,0]
array([ 0, 12])
b[0]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
咱们还能够这样写,选取第1层楼的全部房间:
b[0,:,:]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
多个冒号能够用一个省略号(...)来代替,所以上面的代码等价于:
b[0,...]
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
进而能够选取第1层楼、第2排的全部房间:
b[0,1]
array([4, 5, 6, 7])遍历
(4) 再进一步,咱们能够在上面的数组切片中间隔地选定元素:方法
b[0,1,::2]
array([4, 6])异常
(5) 若是要选取全部楼层的位于第2列的房间,即不指定楼层和行号,用以下代码便可:英文
b[...,1]
array([[ 1, 5, 9],
[13, 17, 21]])
相似地,咱们能够选取全部位于第2行的房间,而不指定楼层和列号:
b[:,1]
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
若是要选取第1层楼的全部位于第2列的房间,在对应的两个维度上指定便可:
b[0,:,1]
array([1, 5, 9])co
(6) 若是要选取第1层楼的最后一列的全部房间,使用以下代码:block
b[0,:,-1]
array([ 3, 7, 11])
若是要反向选取第1层楼的最后一列的全部房间,使用以下代码:
b[0,::-1,-1]
array([11, 7, 3])
在该数组切片中间隔地选定元素:
b[0,::2,-1]
array([ 3, 11])
若是在多维数组中执行翻转一维数组的命令,将在最前面的维度上翻转元素的顺序,在咱们
的例子中将把第1层楼和第2层楼的房间交换:
b[::-1]
array([[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]],工作
[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]])
刚才作了些什么 咱们用各类方法对一个NumPy多维数组进行了切片操做。