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

个下标用英文标点的冒号:来代替:

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])

(6) 如果要选取第1层楼的最后一列的所有房间,使用如下代码:

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多维数组进行了切片操作。

【NumPy学习指南】day4 多维数组的切片和索引的更多相关文章

  1. 【NumPy学习指南】day5 改变数组的维度

    我们已经学习了怎样使用reshape函数,现在来学习一下怎样将数组展平. (1) ravel 我们可以用ravel函数完成展平的操作: In: b Out: array([[[ 0, 1, 2, 3] ...

  2. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

  3. golang多维数组的切片

    通过for循环来取多维数组的切片 package main import ( "fmt" ) func main() { a := [...]string{"USA&qu ...

  4. NumPy学习指南(第2版)

    第一章 NumPy快速入门 首先,我们将介绍如何在不同的操作系统中安装NumPy和相关软件,并给出使用NumPy的简单示例代码. 然后,我们将简单介绍IPython(一种交互式shell工具). 如前 ...

  5. NumPy 学习(2): 数组的操作

    1. 简单一维数组的操作 一维数组的操作类似于python自身的list类型. In [14]: arr = np.arange(10) In [15]: arr Out[15]: array([0, ...

  6. Python开发:NumPy学习(一)ndarray数组

    一.数据维度 一个数据表达一个含义,一组数据表达一个或多个含义. 数据维度概念:一组数据的组织形式,其中有一维数据.二维数据.多维数据.高维数据. 1.  一维数据 一维数据由对等关系的有序或无序数据 ...

  7. NumPy 学习 第四篇:数组的基本操作

    在数组中,用axis(轴)表示维度,对于三维数组,axis参数的取值通常有: 当axis=None时,表示把数组展开为一维数组: 当axis=0时,表示按照行(第一维)进行计算: 当axis=1时,表 ...

  8. matlab学习笔记11_1低维数组操作

    一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...

  9. numpy基础教程--将二维数组转换为一维数组

    1.导入相应的包,本系列教程所有的np指的都是numpy这个包 1 # coding = utf-8 2 import numpy as np 3 import random 2.将二维数组转换为一维 ...

随机推荐

  1. .pdm文件怎么打开

    1. 用PowerDesigner打开.pdm文件

  2. sql添加表

    IF EXISTS(SELECT * FROM sysobjects WHERE name='learnRecord') DROP TABLE learnRecord GO CREATE TABLE ...

  3. HDU1080 【LCS变形】

    题意: 给你每种字符匹配的权值大小,给你两个串,长度小的串可以在小串里面添加空格和大串匹配,问你一个最大匹配权值. 思路: 有点类似于LCS吧,我们在求两个串的LCS的时候,不行的就扔掉了,在这里就是 ...

  4. [Xcode 实际操作]二、视图与手势-(2)UIView视图的层次关系

    目录:[Swift]Xcode实际操作 本文将演示创建三个视图对象,其中第二个视图是第三个视图的父视图. 现在开始编写代码,实现这项功能 import UIKit class ViewControll ...

  5. ASPNET-ASPNETCORE 认证

    话题背景 关于认证我的个人理解是,验证信息的合法性.在我们生活当中,比如门禁,你想进入一个有相对安全措施的小区或者大楼,你需要向保安或者门禁系统提供你的身份信息证明,只有确定你是小区业主,才可以进来, ...

  6. 反射记录点滴——Field

    反射记录点滴 1. 反射获取类的属性 Class.getDeclareFileld(String name) 返回一个Filed对象,该对象反映此Class对象所表示的类或接口的指定已声明字段. Cl ...

  7. 用shell脚本监控MySQL主从同步

    企业面试题1:(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员.提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:阶段1:开发一个守护进程脚本每30秒 ...

  8. 黑马函数式接口学习 Stream流 函数式接口 Lambda表达式 方法引用

  9. iOS开发 - RunLoop理解

    RunLoop概念 运行循环,一个 run loop 就是一个事件处理的循环,用来不停的调度工作以及处理事件 作用 保持程序的持续运行 监听处理App中的各种事件(触摸事件,定时器事件,selecto ...

  10. STP-5-STP配置及分析

    拓扑: root id列出了根的网桥id为两部分,前边是优先级,后边跟着mac地址,cost 0 暗示sw1就是根: 下边的命令确认sw1就是vlan1的根: 下边,sw2配置了一个比sw1更低的优先 ...