微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【NumPy学习指南】day4 多维数组的切片和索引

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
(3) 如果我们不关心楼层,也就是说要选取所有楼层的第1行、第1列的房间,那么可以将第1
个下标用英文标点的冒号:来代替:

b[:,0]
array([ 0,12])

b[0]
array([[ 0,11]])
我们还可以这样写,选取第1层楼的所有房间:

b[0,:,:]
array([[ 0,11]])
多个冒号可以用一个省略号(...)来代替,因此上面的代码等价于:

b[0,...]
array([[ 0,11]])
进而可以选取第1层楼、第2排的所有房间:

b[0,1]
array([4,7])
(4) 再进一步,我们可以在上面的数组切片中间隔地选定元素:

b[0,::2]
array([4,6])
(5) 如果要选取所有楼层的位于第2列的房间,即不指定楼层和行号,用如下代码即可:

b[...,1]
array([[ 1,9],
[13,21]])
类似地,我们可以选取所有位于第2行的房间,而不指定楼层和列号:

b[:,1]
array([[ 4,19]])
如果要选取第1层楼的所有位于第2列的房间,在对应的两个维度上指定即可:

b[0,1]
array([1,9])
(6) 如果要选取第1层楼的最后一列的所有房间,使用如下代码

b[0,-1]
array([ 3,7,11])
如果要反向选取第1层楼的最后一列的所有房间,使用如下代码

b[0,::-1,-1]
array([11,3])
在该数组切片中间隔地选定元素:

b[0,::2,11])
如果在多维数组中执行翻转一维数组的命令,将在最前面的维度上翻转元素的顺序,在我们
的例子中将把第1层楼和第2层楼的房间交换:

b[::-1]
array([[[12,23]],

   [[ 0,[ 4,[ 8,11]]])

刚才做了些什么
我们用各种方法一个NumPy多维数组进行了切片操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐