2020,努力做一个无可替代的人!

作者 | 小一

全文共2833字,阅读全文需10分钟

写在前面的话

没想到吧,NumPy 还有一小节,请珍惜 NumPy 最后的美好时光。

这一节的内容源自于一个朋友的提问,我在交流群里也分享过,具体问题会在正文中复现,知道你们好奇,往下看就好。

害,差点忘了,先回顾下前三节的内容,同学们自行复习:

  • 《Hello NumPy》系列-数据类型与创建

  • 《Hello NumPy》系列-切片的花式操作

  • 《Hello NumPy》系列-运算与函数应用

听说抬起头看天眼眶才不会湿?

我想试试

正文

先来复现一下朋友当时问我的问题:

有一个数据a(DataFrame类型、3行4列的数据),数据b(Series类型、[0,1,2]),比较a和b后输出布尔型数组

看一下代码演示

# 创建 DataFrame
import pandas as pd
df_a = pd.DataFrame(np.arange(12).reshape(3, 4))
# 输出0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11# 创建 Series
import numpy as np
series_b = pd.Series(np.arange(3))
# 输出
0    0
1    1
2    2
dtype: int32

代码可以左右滑动,你还不知道?

就这样两个数据类型,我刚开始一听第一反应是:这咋比较?数据类型都不一样,维度也不一样。

直到我翻开书看了一下才想起这个概念:广播

先看一下比较的结果是什么

df_a > series_b
# 输出0      1      2      3
0  False  False  False  False
1   True   True   True  False
2   True   True   True  False

如果你知道为什么会出现上面这个结果,那恭喜你,这一小节你可以直接跳过,相信我,你是最NB的

不知道的同学我们还是要继续的,看完今天的文章想必你会明白。

广播

上面问题提到的一个概念,也是今天唯一的一个知识点:广播

广播指的是不同形状的数组之间的算术运算的执行方式。

首先,将标量数组和数组合并时就会发生简单的广播。

# 创建数组
data_arr1 = np.arange(5)# 输出
[0 1 2 3 4]data_arr1 * 5
# 输出
[ 0  5 10 15 20]

在上面的乘法运算中,标量值4你也可以看做是一个一行一列的数组,被广播到其他所有的元素上。

这是最简单的标量的广播,那如果是数组的广播呢?

看例子:

# 创建4行3列的二维数组
data_arr2 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
# 输出
[[0 0 0][1 1 1][2 2 2][3 3 3]]# 创建一维数组
data_arr3 = np.array([1, 2, 3])
# 输出
[1 2 3]# A + B
data_arr2 + data_arr3
# 输出
[[1 2 3][2 3 4][3 4 5][4 5 6]]

没想到吧,竟然可以计算而没有报错。

这是因为数组 data_arr3 在0轴上做的广播(灰色数字),将原本1行3列的数组广播成4行3列,从而可以与 data_arr2 进行计算

ok,想必你应该清楚广播是什么作用了吧

当然,广播也不是说所有情况都会广播,人家也是有原则的。

何为广播?

如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的广播会在缺失和(或)长度为1 的维度上进行。

这句话是理解广播的核心,老实说,看懂了吗?

不懂往下看,抬起头看天是看不到答案的,只会不让眼泪流下来!

广播主要发生在三种情况下:

  • 一种是两个数组的维度不相等,但是它们的后缘维度的轴长相符

  • 另一种是两个数组的维度相同,对应维度的轴长要么相等要么任意一个为1

  • 上面两种的结合体

第一种情况

两个数组的维度不相等,但是它们的后缘维度的轴长相符

以上面的例子为例

# 输出数组形状/维度
data_arr2.shape
data_arr3.shape# 输出
(4, 3)
(3,)

可以看到,data_arr2 (4, 3)是二维的,data_arr3 (3,)是一维的,两个数组的维度不相等。同时,它们的后缘维度都是3,后缘维度的轴长相等。

完美符合我们的第一种情况,所以可以进行相加运算。

同样的道理,多维数组也遵循广播原则。

举个图例:

以此类推:

  • (2,4,2,4) 和 (2,3,4) 是兼容的

  • (2,4,2,4) 和 (2,4) 是兼容的

  • (2,4,2,4) 和 (4) 是兼容的

只是它们需要扩展的轴个数不同。

第二种情况

两个数组的维度相同,对应维度的轴长要么相等要么任意一个为1

这个就比较容易理解了,两个维度相同的数组,对应的维度长度有两种情况:

要么长度相同,要么有一个长度为1

# 创建4行1列的二维数组
data_arr4 = np.array([[1, 2, 3, 4]]).reshape(4, 1)
# 输出
[[1][2][3][4]]# 创建1行3列的二维数组
data_arr5 = np.array([[1, 2, 3]])
# 输出
[[1 2 3]]

这两个数组都是二维数组分别是(4, 1)、(1, 3)

与我们的 data_arr2 (4, 3) 相比,根据第二种情况:

(4, 3) 与 (4, 1) 维度相同,第一维长度相同,第二维存在长度为1;

(4, 3) 与 (1, 3) 维度相同,第一维存在长度为1,第二维长度相同;

(4, 1) 与 (1, 3) 维度相同,第一维存在长度为1,第二维存在长度为1。

所以,以上三个数组之间互相兼容。

稍微画个图例:

这个时候,第二个二维数组会在1轴上进行广播(灰色数字)

第三种情况

明白了第一种和第二种形式的广播,第三种就是两者的结合体。

举几个简单的例子你就明白了:

(4, 2, 5) 和 (1, 5) 是兼容的。但是不满足第一、第二种情况

(4, 2, 5) 和 (2, 1) 是兼容的。同样不满足第一、第二种情况

看完这三种情况,是不是清楚了一些?

再来细品一下广播的定义

如果两个数组的后缘维度的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的

所以,当我们拿到两个数组,需要判断是否兼容时,先从后缘维度开始,依次往前。

要么对应维度的长度相等,要么对应维度存在某一方的长度为1。

若两个数组的每一个维度都符合这个要求,那这两个数组一定是兼容的。

总结一下:

今天主要讲到一个概念:广播。

正文最后的总结我觉得很到位了,不妨多读几遍理解一下。

看到广播概念的时候,我猜大部分人刚开始也会很懵逼,字都认识,说了个啥?

所以我列举了三种情况去分解这个概念,还记得是哪三种吗?

  • 两个数组的维度不相等,但是它们的后缘维度的轴长相符

  • 两个数组的维度相同,对应维度的轴长要么相等要么任意一个为1

  • 上面两种的结合体

看完这三种情况后,我们回过头再来看概念,是不是就清晰多了?

ok,《Hello NumPy》系列就完结了,一共四小节,希望对你们有用!

写在后面的话

静下心来写技术文真的也太舒服了吧,希望你们也能静下心舒服的看文章。

我一直以为这几天做的最认真的事就是洗手,结果发现我写文章也可以这么认真。

都怪文章名字没起好,对不起自己。说到这,我的眼眶又湿了。

最近不能去外面吃好的,下班一有空就窝家里写文章,都饿瘦了。

之前买的一箱泡面差不多都吃完了,和我爸妈视频的时候他们都说我饿瘦了

不说了,眼眶全湿了…

下个系列见

碎碎念一下

我发现了自己文章起名字的能力真的太差了,还挺影响阅读量的

就像这个系列的名字一样,贼差劲!

知错就改,下个系列一定好好起名

不过名字没起好不妨碍你们点在看吧?

Python 系列

入门:准备工作  运算符  数据类型①  数据类型②  流程控制  函数  文件  模块  异常

进阶:面向对象  正则表达式  多线程与多进程  JSON操作  时间序列  数据库操作  邮件发送

高阶:事半功倍的高阶函数  NumPy系列① NumPy系列②  NumPy系列③

技巧:学习技巧①  学习技巧②  学习技巧③

爬虫系列

基础:准备工作  爬虫实现方式  Requests详解  BeautifulSoup详解

进阶:获取动态数据①  获取动态数据②

实战:爬取豆瓣电影  豆瓣电影分析  爬取链家租房

其他系列

学排版:Markdown排版教程

领资料:数据分析干货礼包

非技术系列

讲故事:小一的故事  和二三四们的故事

听故事:投稿故事①

投故事:看故事之前先看我

好巧啊,你也读到这了!

点个在看让我看到你

浅入浅出数据分析之Hello NumPy系列(四)相关推荐

  1. 浅入浅出深度学习理论实践

    全文共9284个字,40张图,预计阅读时间30分钟. 前言 之前在知乎上看到这么一个问题:在实际业务里,在工作中有什么用得到深度学习的例子么?用到 GPU 了么?,回头看了一下自己写了这么多东西一直围 ...

  2. [科普]浅入浅出Liunx Shellcode

    创建时间:2008-05-13 文章属性:原创 文章提交: pr0cess  (pr0cess_at_cnbct.org) 浅入浅出Liunx Shellcode /*---------------- ...

  3. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  4. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到浅入深出之Java集合框架(下). ...

  5. Angular浅入深出系列 - 写在前面

    本系列目录: 写在前面 基础知识 控制器(Controller) 作用域(Scope) 集合(Collection) 模块(Module) 依赖注入(Dependency Injection) 服务( ...

  6. SegmentFault 技术周刊 Vol.16 - 浅入浅出 JavaScript 函数式编程

    函数式编程(Functional Programming),一看这个词,简直就是学院派的典范. 以至于从 Lisp 的创世,到 Scheme.Haskell.Clean.Erlang.Miranda. ...

  7. 浅入浅出 Android 安全 翻译完成!

    浅入浅出 Android 安全 翻译完成! 作者:Yury Zhauniarovich 译者:飞龙 来源:Yury Zhauniarovich | Publications 在线阅读 PDF格式 EP ...

  8. 浅入深出Vue:环境搭建

    浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...

  9. 处理中文乱码_浅入深出:一次提问引发的深思,从此再也不怕“乱码”问题

    这是恋习Python之浅入深出系列第3篇原创首发文章 作者|丁彦军 来源|恋习Python(ID:sldata2017) 转载请联系授权(微信ID:2394608316) 近日,有位粉丝向我请教,在爬 ...

最新文章

  1. 华为c语言编程规范_C语言编程规范
  2. CVPR 2019 Oral 亮风台提出端到端投影光学补偿算法,代码已开源
  3. magento如何如何找到对应html文件_Servlet如何配置xml
  4. 如何开发一个完整的JavaScript组件
  5. SQL Server索引超出了数组界限解决方法
  6. JUnit 单元测试多线程测试解决方法
  7. smali 添加资源
  8. 如何认识会计科目,看懂财务报表
  9. 如何做一个被领导喜欢的实施顾问
  10. 19c(19.3) 单机数据库安装
  11. 拦截X64安卓模拟器封包拦截发送技术(不用代理/网卡/dll一切)
  12. Windows平台快速安装MongoDB和Robo 3T
  13. asp.net mvc 网站生成二维码
  14. clickhouse 报错 “Unmatched parentheses: (“ 或者报错 “Expected one of: CODEC, NULL, ALIAS, TTL, ClosingR
  15. pcl::compute3DCentroid()计算质心算法原理
  16. java web—水果店管理系统
  17. 科学计算机如何进行复数运算,教你如何用你的卡西欧学生计算器进行复数运算!...
  18. 解析eBay BASE模式、去哪儿及蘑菇街分布式架构
  19. Intel AVX入门实践
  20. E71-433MS30芯片(CC1310无线模块 )mosbus协议通信(主机)

热门文章

  1. java StringBuilder追加换行符
  2. 特斯拉、谷歌最可怕的对手!乔治·霍兹(George Hotz)
  3. 打印html所有标签,js 打印标签里的所有内容(带分页)
  4. 【日常分享】规格化成绩如何计算
  5. GPGPU-SIM(原码阅读)(流多处理器部分完成)
  6. 功能覆盖率与代码覆盖率区别
  7. PROFINET实时以太网协议
  8. Python--------随机生成四位数字与大写英文字母组合的验证码(简单版)
  9. Diffusion Model
  10. for循环去掉最后一个逗号