手把手带你入门numpy,从此数据处理不再慌【四】
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式。
首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape。在保证数组当中所有元素不变的前提下,变更数组形状的操作。比如常用的操作主要有两个,一个是转置,另外一个是reshape。
转置与reshape
转置操作很简单,它对应线性代数当中的转置矩阵这个概念,也就是说它的功能就是将一个矩阵进行转置。
转置矩阵的定义是将一个矩阵的横行写为转置矩阵的纵列,把纵列写成转置矩阵的横行。这个定义的是二维的矩阵,本质上来说,转置操作其实是将一个矩阵沿着矩阵的大对角线进行翻转。翻转之后,显然这个矩阵的各个维度都会发生变化。
其中二维的矩阵最直观,一个4 x 3的矩阵,转置之后得到的是3 x 4的矩阵。如果维度更多呢?如果是3 x 2 x 4的矩阵转置之后会得到什么?
很简单,得到的会是4 x 2 x 3的矩阵。我们都知道,如果我们把一个矩阵各个维度的大小写在一起,会得到一个元组(tuple),这个元组称为矩阵的shape,我实在是不知道该怎么翻译这个单词,但是我觉得叫做形状不太妥当,所以就保留了英文原文。转置之后,矩阵的shape会整个翻转。比如(3, 2, 4)会变成(4, 2, 3)。
我们可以来看一个例子,会更加的直观。首先我们先看最简单的二维矩阵:
这是随机出来的一个3 x 4的二维矩阵,在numpy当中,有两种方式获取一个矩阵或者是数组的转置。第一种方式是通过在数组的变量名之后加上.T操作符,第二种方式是调用numpy中的transpose函数,这两种方式是一样的。我个人比较倾向于前者,写起来比较简单。
我们可以看到转置之后新的矩阵的第一列其实是原矩阵的第一行,第一行是原矩阵的第一列。可以看成是原矩阵按照从左上角到右下角的一条无形的线翻转之后的结果。
理解了转置之后,我们再来看reshape操作。其实我们从这个单词上也能大概猜到它的意思,reshape也就是再次shape的意思,本意是根据我们想要的shape重新组装矩阵当中的元素。
我们来看一个例子吧,首先,我们通过arange方法来获取一个一维的数组:
因为是1维的,所以我们去看它的shape也只有一维。假设我们不喜欢这样的一维数组,而想把它变成3 x 4或者是6 x 2的格式,这时候使用reshape就会很方便。
本质上来说reshape操作其实就是按照顺序从矩阵当中获取元素,然后按照我们制定的shape填充出一个新的矩阵的操作。这个应该不难理解, 它也是非常常用的重塑操作,通过reshape和转置,我们可以很方便地操作矩阵的大小,根据我们的需要作出改变。
三元表达式
在许多编程语言当中我们经常会用到三元表达式,三元表达式其实本质就是if-else语句,只是我们用特殊的方法将它简写。
比如说在C++当中,我们可以把if condition A else B简写成:condition ? A : B。Python同样支持三元表达式,不过对C++的三元表达式做了一些改动,在Python当中三元表达式写成:A if condition else B。相对来说更加直观一些,我们经常会在数组初始化的时候用到三元表达式。
比如,我们可能会这样生成一个数组:
arr = [1 if condition else 0 for _ in range(10)]
我们通过条件来判断了每一位是1还是0来生成了一个数组,简化了代码。在numpy当中同样继承了这个用法,我们一样可以使用三元表达式,不过numpy将它封装进了where函数当中,我们是通过调用一个方法来实现三元表达式的功能。我们来看下具体的用法,假设我们有两个数组:
我们还有一个bool型的数组c,我们希望根据c数组选择从a数组或者是b数组当中获取数据。我们可以使用where写成这样:
在这个例子当中,c数组中的1和0分别表示True和False。当我们调用np.where的时候,numpy会自动根据c数组当中的值去选择从a数组还是b数组当中获取数据。相当于我们执行了这么一段代码:
[x if c else y for c, x, y in zip(c, a, b)]
虽然两者的运行结果是一样的,但是显然使用循环的方法计算耗时更长,而使用numpy的向量做法运算速度更快。除此之外,numpy的where方法还支持高维的数组,但是循环的方法不行。并且where还有一些更高级的用法,比如说我们传入的第二个和第三个参数,可以不是数组而是一个标量。比如我们可以指定当c中的元素是True的时候填入1,否则填入-1:
甚至我们还可以将标量和向量结合起来使用:
并且这里的数组c也可以替换成逻辑运算:
总结
今天的文章主要介绍了Numpy当中的reshape、转置以及where的用法,这些也是numpy的基础用法,尤其是转置、reshape,几乎是处理数据必用的方法。所以想要从事Python机器学习或者是人工智能的小伙伴,numpy的这些用法是一定要会的。
本文当中介绍的只是numpy的一些固定套路,但其实numpy很多的用法是可以组合的,一些看似平淡无奇的用法组合在一起之后会有神奇的效果。这一点光看书或者是资料是很难穷尽的,所以如果你已经学会了这些api的基本使用,接下来最应该做的是去读一些大牛的源码,看看大牛们是如何运用这些工具的,相信一定还会有新的收货。
文章就到这里,如果喜欢本文,可以的话,请点个关注。
本文使用 mdnice 排版
手把手带你入门numpy,从此数据处理不再慌【四】的更多相关文章
- 手把手教你学numpy,从此数据处理不再慌【三】
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是numpy专题的第三篇,我们来聊聊numpy当中的索引. 上篇的末尾其实我们简单地提到了索引,但是没有过多深入.没有过多深入的原因也很 ...
- 零基础学Java,PayPal技术专家手把手带你入门
在最权威的 TIOBE 编程语言排名榜单上,Java 常年稳居第一,可以说是世界上应用最为广泛的一门语言. 同时,在微服务.云计算.大数据.Android App 开发等领域,Java 也是当之无愧的 ...
- 从0开始手把手带你入门Vue3-全网最全(1.1w字)
天命不足畏,祖宗不足法. --王安石 前言 本文并非标题党,而是实实在在的硬核文章,如果有想要学习Vue3的网友,可以大致的浏览一下本文,总体来说本篇博客涵盖了Vue3中绝大部分内容,包含常用的Com ...
- 手把手带你入门神秘的RxJava
1.什么是RxJava• Rx是Reactive Extensions的简写,翻译为响应的扩展.也就是通过由一方发出信息,另一方响应信息并作出处理的核心框架代码. • 该框架由微软的架构师Erik M ...
- 手把手带你入门ECharts
1.什么是ECharts ECharts,缩写来自Enterprise Charts,商业级数据图表,是来自百度商业前端数据可视化团队EFE的一个开源的纯Javascript的图表库,可以流畅的运行在 ...
- Django:手把手带你入门
一.开发环境: Python:2.7:PyCharm 4 二.Django的安装: 打开Pycharm --> 新建项目--> 看图操作--> 自动安装Django环境 三.创建第一 ...
- 手把手带你入门kubernetes部署
实验环境准备 k8s-master 192.168.2.156 k8s-node节点 192.168.2.161 Ps:两台保证时间同步,firewalld防火墙关闭,selinxu关闭,系统 ...
- 手把手带你入门 Spring Security!
Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理 ...
- NN入门,手把手教你用Numpy手撕NN(三)
NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...
随机推荐
- ES6,ES7,ES8 常用特性总结
一. ES6(ES2015) 1. 变量 let 和常量 const var 的问题 可以重复声明,没有报错和警告 无法限制修改 没有块级作用域, { } let 和 const 不能重复声明 都是块 ...
- ruoyi-plus-server(一):引入Mybatis-Plus
背景:著名开源管理系统ruoyi-vue是基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统(https://gitee.c ...
- spark机器学习从0到1支持向量机SVM(五)
分类 分类旨在将项目分为不同类别. 最常见的分类类型是二元分类,其中有两类,通常分别为正数和负数. 如果有两个以上的类别,则称为多类分类. spark.mllib支持两种线性分类方法:线性支持 ...
- Django模板之模板变量
深度查询句点符(.)在模板语言中有特殊的含义. 当模版系统遇到点("."),它将以这样的顺序查询: 字典查询(Dictionary lookup) 属性或方法查询(Attribut ...
- oracle的操作-表空间
查询以创建的表空间 select dbms_metadata.get_ddl('TABLESPACE','你的表空间名称') from dual; --查询空间创建的位置 select t1.name ...
- ESlint中console.log报错问题
ESlint中console.log报错问题 由于ESlint规范化,导致console.log的使用也会报错,下面是设置允许console.log控制台输出 描述:打开 package.json 文 ...
- CF #459 D. MADMAX
D. MADMAX time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...
- 剑指Offer之调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路:将奇数放进 ...
- 【书签】stacking、blending
读懂stacking:模型融合Stacking详解/Stacking与Blending的区别 https://blog.csdn.net/u014114990/article/details/5081 ...
- Rocket - debug - Example: Write Memory
https://mp.weixin.qq.com/s/on1LugO9fTFJstMes3T2Xg 介绍riscv-debug的使用实例:使用三种方法写内存. 1. Using System Bus ...