第十天

Numpy数组布尔掩码和花哨的索引

当你想基于默写准则来抽取、修改、计数或对一个数组中的值进行其他操作时,掩码就可以派上用场了。例如你可能希望统计数组中有多少值大于某一个给定值,或者删除所有超出某些阈值的异常点。在Numpy中,布尔掩码通常是完成这类任务的最高效方式。

一、操作布尔数组

通用函数中,我们看到+,-,*,/等一些运算符实现了数组的逐元素操作。Numpy还实现了<(小于)和>(大于)的逐元素比较的通用函数。这些比较运算的结果是一个布尔数据类型的数组。

x = np.array([1, 2, 3, 4, 5, 6])
x < 3 # 小于
# [True, True, False, False, False, False]

给定一个布尔数组,可以实现很多有用的操作。

生成一个二维数组x
x = np.random.randint(10, size=(3, 4))
print(x)

1.统计记录的个数

# 有多少值小于6
np.count_nonzero(x < 6)
# 或者使用sum
np.sum(x < 6)
-----------------------
sum的好处是和其他Numpy聚合函数一样,这个求和也可以沿着行或列进行
# 每行有多少值小于6
np.sum(x < 6, axis=1)
# array([3, 3, 3])
-----------------------
如果想要快速检查或所有这些值是否为True,可以使用np.any和np.all
# 有没有大于6的
np.any(x > 8)
# 是否所有值都小于10
np.all(x < 10)
​

2.布尔运算符

Python里面的逐位逻辑运算符有&、|、^、和~来实现。同标准运算符一样,Numpy用通用函数重载了这些逻辑运算符,这样就可以实现数组的逐位运算。

# 统计x中大于2但是小于6的
np.sum((x > 2) & (x < 6))
# 当然也可以用另一种方式实现
np.sum(~((x <= 2) | (x >= 6))

二、布尔数组作为掩码

前面,我们看到了可以直接对布尔数组进行聚合计算。一种强大的模式是使用布尔数组作为掩码,通过掩码选择数据的子数据集。

# 可以使用 x < 5来获取一个布尔数组
现在可以将这些值从数组中选出,可以进行简单的索引,掩码操作
x[x < 5]
array([0, 1, 3, 2, 0, 1, 4])

现在返回的是一个一维数组,它包含了所有满足条件的值。换句话说,所有的这些值是掩码数组对应位置为True的值。

通过将布尔操作、掩码操作和聚合结合,可以快速回答对数据集中的挑选操作问题。

三、花哨的索引

前面的章节,我们看到如何利用简单的索引值(arr[0])、切片(arr[:5])和布尔掩码获得并修改部分数组。花哨索引和前面的简单索引非常类似,但是传递的是索引数组,而不是单个标量。花哨索引让我们能够快速获得并修改复杂的数组值的子数据集。

1.花哨索引

花哨索引在概念上非常简单,它意味着传递一个索引数组来一次性获得多个数组元素。

rand = np.random.RandomState(42)
x = rand.randint(100, size=10)
print(x)
# [51 92 14 71 60 20 82 86 73 74]

假设我们希望获得三个不同的元素,可以用下面方式实现:

[x[3], x[7], x[2]]
------------------
# 另一种方法是通过传递索引的单个列表或数组来获得同意的结果
index = [3, 7, 4]
x[index]
# array([71, 86, 60])

当然,花哨的索引也对多个维度使用。

m = np.arange(12).reshape((3, 4))
print(m)
# array([[0, 1, 2, 3],[4, 5, 6, 7],[8, 9, 10, 11]])

和标准的索引方式一样,第一个索引指的是行,第二个索引指的是列:

row = np.array([0, 1, 2])
col = np.array([2, 1, 3])
m[row, col]
# array([2, 5, 11])

这里需要注意的是,结果的第一个值是m[0, 2],第二个值是m[1, 1],第三个值是m[2, 3]。在花哨索引中,索引值的配对遵循前面说到的广播的规则。因此,当我们将列向量和一个行向量组合在一个索引中时,会得到一个二维的结果。

m[row[:, np.newaxis], col]
# array([[2, 1, 3],[6, 5, 7],[10, 9, 11]])

2.组合索引

花哨的索引可以和其他索引方式结合起来形成更强大的索引操作。

# 花哨索引和简单索引组合:
m[2, [2, 0, 1]]
# array([10, 8, 9])
# 花哨索引和切片组合:
m[1:, [2, 0, 1]]
# array([[6, 4, 5],[10, 8, 9]])
# 花哨索引和掩码组合:
mask = np.array([1, 0, 1, 0], dtype=bool)
m[row[:, np.newaxis], mask]
# array([[0, 2],[4, 6],[8, 10]])

索引选项的组合可以实现非常灵活的获取和修改数组元素的操作。

3.花哨索引修改值

正如花哨索引可以被用于获取部分数组,它也可以被用于修改部分数组。例如,假设我们有一个索引数组,并且希望设置数组中对应的值:

x = np.arange(10)
i = np.array([2, 1, 8, 4])
x[i] = 99
print(x)
# [0 99 99 3 99 5 6 7 99 9]  索引2 1 8 4 位置的值被修改为99
# 也可以用任何的赋值来实现
x[i] -= 10
# [0 89 89 3 89 5 6 7 89 9]

不过需要注意的是操作中重复的索引会导致一些出乎意料的结果产生。一般不建议使用重复的索引操作。

100天搞定机器学习(100-Days-Of-ML)(十)Numpy数组布尔掩码和花哨的索引相关推荐

  1. 火爆GitHub:100天搞定机器学习编程(超赞信息图+代码+数据集)

    问耕 栗子 发自 麦蒿寺 量子位 出品 | 公众号 QbitAI 你是想喝一辈子糖水,还是想用AI改变世界? 但怎么想是一回事,怎么做往往是另一回事.学习和健身一样,不少人都停留在口头上,有各种借口不 ...

  2. 100天搞定机器学习|day37 无公式理解反向传播算法之精髓

     100天搞定机器学习(Day1-34) 100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算法 本篇为100天搞定机器学习之第37天,亦 ...

  3. 100天搞定机器学习:PyYAML基础教程

    编程中免不了要写配置文件,今天我们继续Python网络编程,学习一个比 JSON 更简洁和强大的语言----YAML .本文老胡简单介绍 YAML 的语法和用法,以及 YAML 在机器学习项目中的应用 ...

  4. 100天搞定机器学习

    100天搞定机器学习 大家好,100天搞定机器学习前54天是对Avik-Jain开源项目100-Days-Of-ML-Code的翻译 自己的理解https://github.com/Avik-Jain ...

  5. GitHub热门教程:100天搞定机器学习(中文版)

    来源:Python开发者 本文多干货,建议收藏. 中文版持续放送中!大家快跟上呀! 100 Days Of ML Code (机器学习 100 天英文版)刚出来时,我们推荐过.目前英文版已经快 20k ...

  6. 100天搞定机器学习(100-Days-Of-ML)(一)数据预处理

    这是github一个开源项目,作者是Avik Jain,内容是从机器学习的基础概念起步,逐层递进,很适合初学者.github地址是https://github.com/Avik-Jain/100-Da ...

  7. 随机森林c++_100天搞定机器学习|Day3334 随机森林

    点击上方"机器学习与统计学",选择"置顶"公众号 重磅干货,第一时间送达 前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性 ...

  8. 300张小抄表搞定机器学习知识点:学习根本停不下来!

    入坑数据科学和人工智能的同学都知道,机器学习是一个集合了计算机.统计学和数学知识的交叉领域,除了日常练习,也需要很多枯燥的记忆和理解.单纯读书不容易串联概念,又容易忘记. 可能你和我一样,读了无数遍& ...

  9. 如何用一套引擎搞定机器学习全流程?

    作者:陈戊超(仲卓) 深度学习技术在当代社会发挥的作用越来越大.目前深度学习被广泛应用于个性化推荐.商品搜索.人脸识别.机器翻译.自动驾驶等多个领域,此外还在向社会各个领域迅速渗透. 背景 当前,深度 ...

最新文章

  1. 深度学习不得不会的迁移学习Transfer Learning
  2. Linux 搜索指令
  3. (需求实战_02)_ftp连接下载指定.zip类型文件
  4. python2.7升级到python3.6注意事项
  5. python-模块的嵌套调用-随堂草稿件
  6. MemoryRecords分析
  7. 决定薪资高低的到底什么?
  8. java程序a-z b-y_请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串..._考试资料网...
  9. “互联网+”医疗服务
  10. matlab qpsk代码 博客,完整版QPSK调制原理及matlab程序实现
  11. 计算机rankeq函数,Excel中的rank函数与rank.eq函数有什么区别
  12. py实现高斯列选主元消元法
  13. OffiSmart Summit智慧办公及空间管理上海线下峰会精彩亮点抢先看
  14. 怎么在Wpf放置背景图片
  15. 小蓝本 第一本 《因式分解技巧》 第八章 多项式的一次因式 笔记 (第八天)
  16. 2011.4.5 凌晨 3:50分
  17. JS调试的一些小技巧
  18. 电子元器件搜索引擎 白嫖AD原理图符号、PCB封装和3D模型(超详细)
  19. 海康威视网络摄像头开发流程(四)-------- 下载萤石云js插件
  20. 【好书荐读】《世界因你不同——李开复自传》

热门文章

  1. 什么是 web 语义化?有什么好处?
  2. 收下这份十万商家称赞的开店攻略,带你发家致富!
  3. WiFi共享精灵在使用时出现的错误代码1的解决方法
  4. android简单布局素材(2)—渐出底部标题栏
  5. 计算机基础知识(电脑的基本组成原则)
  6. 想评副高职称,你得满足高职称评定论文要求
  7. HikariPool连接超时解决方案
  8. PDF文件怎样修改更换图片的技巧
  9. socket编程java笔试_面向应届实习生的Java笔试题
  10. 健身行业冲出独角兽,Peloton申请IPO:新的风暴已经出现?