Numpy数组切片、bool索引、掩码和花哨索引

数组切片(slice)

数组切片的公式为 my_array[start: end: step, start: end: step]

#示例1:
import numpy as np
#设置随机种子
np.random.seed(0)
#初始化一个维度为3x4的数组
a = np.random.randint(0,10,(3,4))
#取出a数组前2行和前2列组成的数组
print(a)
print(a[0:2:1, 0:2:1])#输出如下
[[5 0 3 3][7 9 3 5][2 4 7 6]]
[[5 0][7 9]]
#可以看到,对a取切片结果直观上就是取出数组中的一部分

在实际应用中,根据需要可以对r_start: r_stop: r_step句式进行简化,列的切片索引也是一样

依然以数组a作为演示:

简化操作 等价的完整操作
: : -1 end: 0: -1,表示反向遍历
: 0: end: 1,表示正向遍历
: a 0: a: 1,表示取该轴上的前a个元素
#行倒序排列并且取所有的列
print(a[::-1,:])
#与数组元素索引一起使用,取第一行并且取前2列
print(a[1,:2])#输出如下:
[[2 4 7 6][7 9 3 5][5 0 3 3]]
[7 9]

bool索引(bool indexing)

Numpy的通用函数可以用来替换循环,以快速实现数组的逐元素(element-wise)运算,同样,我们也可以通过其他通用函数实现数组的逐元素比较,这些用于用于比较的通用函数可以用运算符等价。

运算符 对应的通用函数
== np.equal
!= np.not_equal
< np.less
<= np.less_equal
> np.greater
>= np.greater_equal
In [43]: x= np.arange(10)In [44]: x<5 #小于
Out[44]:
array([ True,  True,  True,  True,  True, False, False, False, False,False])In [45]: x>5 #大于
Out[45]:
array([False, False, False, False, False, False,  True,  True,  True,True])In [46]: x <= 3 #小于等于
Out[46]:
array([ True,  True,  True,  True, False, False, False, False, False,False])In [48]: x >=4  #大于等于
Out[48]:
array([False, False, False, False,  True,  True,  True,  True,  True,True])In [49]: x != 9
Out[49]:
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,False])In [50]: x ==4
Out[50]:
array([False, False, False, False,  True, False, False, False, False,False])

掩码(mask)

通过将bool索引作为参数传给数组(bool索引和数组同型),返回一个所有bool索引为True的子数组(一维)

np.random.seed(0)
x = np.random.randint(0,10,(3,4))
bool_index = x < 5
print(x)
print(x[bool_index])#输出如下
[[5 0 3 3][7 9 3 5][2 4 7 6]]
[0 3 3 3 2 4]

花哨索引(fancy indexing)

花哨索引和前面的简单索引非常相似,但是传递的是索引数组,而不是单个标量。花哨索引让我们能够快速获得并修改复杂的数组值的子数据集。

花哨索引在概念上非常简单,它意味着传递一个索引数组来一次性获得某个维度上的多个数组元素,例如以下数组:

#获得一维数组上的多个元素
c = np.arange(10)
fancy_index = [1,6,8]
print(c)
print(c[fancy_index])#结果如下:
[0 1 2 3 4 5 6 7 8 9]
[1 6 8]
#获取二维数组上多个元素
np.random.seed(0)
d = np.random.randint(0,10,(3,4))
print(d)
print(d[[1,2,1],[2,2,0]])#结果如下:
[[5 0 3 3][7 9 3 5][2 4 7 6]][3 7 7]
#这里的花哨索引分别取到了d[1,2]、d[3,2]、d[1,0]
#可以将不同维度上的花哨索引组合起来使用
np.random.seed(0)
d = np.random.randint(0,10,(3,4))
print(d)
#对数组d分别取出行1,行0,行2并按此顺序组合,接着对组合出来的新数组,分别取出列2,列1,列3并按此顺序重新组合
print(d[[1,0,2]][:,[2,1,3]])结果如下:
[[5 0 3 3][7 9 3 5][2 4 7 6]][[3 9 5][3 0 3][7 4 6]]

Numpy学习笔记三——数组切片、bool索引、掩码和花哨索引相关推荐

  1. 【numpy学习笔记】数组的切片,索引,迭代

    1. 一维数组 切片 a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])a[5] # 5a[2:6] # array([2, 3, 4, ...

  2. 【numpy学习笔记】数组的创建和基本运算

    1. 创建numpy数组 1.1 通过tuple和list创建数组 import numpy as np 通过tuple t=(1,2,3) a=np.array(t,dtype= 'int') #a ...

  3. 最简易上手的numpy学习笔记三

    1 数组的复制 2 改变数组的维度 改变这些数组的维度,包含提高数组的维度和降低数组的维度,还包括数组的转置. 通过reshape方法可以将一维数组变成二维.三维或者多维数组.通过ravel方法或fl ...

  4. numpy学习笔记:np.zeros应用——生成三通道全黑Mask(蒙版)

    numpy学习笔记:np.zeros应用--生成三通道全黑Mask(蒙板) np.zeros官方文档:np.zeros官方文档 下面是一段生成256*256三通道全黑mask的demo import ...

  5. 数组存储与指针学习笔记(三)指针与数组

    嵌入式C语言学习进阶系列文章 GUN C编译器拓展语法学习笔记(一)GNU C特殊语法部分详解 GUN C编译器拓展语法学习笔记(二)属性声明 GUN C编译器拓展语法学习笔记(三)内联函数.内建函数 ...

  6. Numpy学习笔记(下篇)

    目录 Numpy学习笔记(下篇) 一.Numpy数组的合并与分割操作 1.合并操作 2.分割操作 二.Numpy中的矩阵运算 1.Universal Function 2.矩阵运算 3.向量和矩阵运算 ...

  7. numpy 学习笔记

    numpy 学习笔记 导入 numpy 包 import numpy as np 声明 ndarray 的几种方法 方法一,从list中创建 l = [[1,2,3], [4,5,6], [7,8,9 ...

  8. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

  9. SurfaceFlinger学习笔记(三)之SurfaceFlinger进程

    概述 本系列是基于android Q 即android10 SurfaceFlinger学习笔记(一)应用启动流程 SurfaceFlinger学习笔记(二)之Surface SurfaceFling ...

最新文章

  1. sqlserver可将字符转成数字再进行sum,如果varchar类型中存放的都是数字
  2. 基于HTML5 Canvas 实现弹出框
  3. 手机端 超链接 识别电话号码
  4. jquery 表单重置通用方法
  5. MM模块几个移动类型之间的区别
  6. 基于C#开发的浏览器隐身工具-上班别乱开
  7. linux 打包解压
  8. 对于Neural ODE的小研究
  9. Adobe AIR移动App的互相调用实现方式
  10. jar 文件不能运行
  11. 【LeetCode】3月18日打卡-Day3
  12. FPGA实现千兆以太网发送
  13. 8个美白小锦囊 不知不觉中白起来
  14. 小程序实现圆点边框 解决 dotted不兼容 小程序圆点边框兼容问题 如何在小程序实现兼容的圆点边框
  15. PhaserTape:把智能手机变成测距仪
  16. 啥是原神?女友说想要全角色语音+表情包,顺手用python把高清图也整下来了
  17. C++ 值传递、指针传递、引用传递详解
  18. 详解安卓Gravity的进制封装
  19. 支付宝微信红包战背后的算盘
  20. 浅谈设计模式之单例模式

热门文章

  1. 学习JQuery插件开发教程
  2. 肝气郁结害处多(一)
  3. vue 源码视频教程
  4. MyBatis批处理
  5. Webmin -- Webmin Users
  6. PHP读取文件内容后清空文件
  7. php 读取html内容_php读取html文件(或php文件)的方法
  8. 三元表达式java_记录一个Java三元表达式中的陷阱
  9. 【Java学习经历系列-2】高一辍学,做过微商,当过代练,唯有编程和爱不可负
  10. 比尔最“浪漫”的事 和IT一起慢慢变老