手把手教你学Numpy,从此处理数据不再慌
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
俗话说得好,机器学习要想玩的溜,你可以不会写Python,但一定不能不会调库(大雾)。Numpy可以说是Python中最基础也是最重要的工具库了,要用Python做机器学习,玩转各种框架,Numpy是必须要会的。像是TensorFlow、pytorch这些知名框架都是基于Numpy进行计算的,可想而知它的重要性。
Numpy存在的必要性
网上关于Numpy的介绍非常多,但说来说去无非是一个Python中数值计算的非常重要的基础包,可以用来很方便地做一些矩阵和大数据的运算。
Numpy是做什么的我们很好理解,但是我们可能更加好奇它更深层次的意义究竟是什么?关于这个问题我们从浅到深不停地追问,可以得到许多不同的答案。
最浅层的回答很简单,Numpy很方便,计算速度快,可以很方便地进行矩阵运算。在Andrew的课程当中,他曾经演示过,同样的矩阵运算,如果我们通过Python中的循环实现速度会比调用Numpy慢上至少上百倍。这个差异显然是非常可怕的。
但为什么Numpy会更快呢?
我们追问下去,又会得到一个新的答案。因为Numpy包底层是通过C++实现的,显然C++运算比Python快得多,所以Numpy自然就更快了。
难道Numpy就只是因为C++更快这么简单吗?
这个问题已经超越了Numpy本身,我们需要从Python的特性来回答了。Python是一门解释型语言,也就是说当我们执行Python的时候,其实是执行了一个Python的解释器。由Python的解释器来解释执行Python的每一行代码。
如果我们把解释器理解成虚拟机,把Python执行的代码理解成虚拟机当中的程序。如果我们虚拟机多开的话,是很难保证线程安全的。为了解决这个问题,Python设计了GIL机制,也就是全局解释器锁,它保证了同一时刻最多只有一个解释器线程在执行。
这个机制保证了线程安全,但是也限制了Python多线程的使用。Python的多线程本质上是伪多线程,因为解释器只有一个线程在跑。所以如果我们想要通过多线程并发来加速计算的话,这是不可能的。
而矩阵和向量的一些操作是可以通过多线程并发来加速计算的,而Python本身的特性导致了Python不能执行这样的操作。那么通过Python调用C++实现的计算库也就是唯一的选择了。实际上不仅是Numpy,几乎所有Python的计算库,都是通过Python调用其他语言实现的。Python本身只是最上层的调用方。
理解了这点除了对于Python可以有更加清晰的认识之外,也有助于之后学习TensorFlow等其他框架。
Numpy中的n维数组
Numpy之所以好用,是因为我们可以通过Numpy很方便地创建高维的数组和矩阵。
举个例子,比如在原生Python当中,当我们需要创建一个二维数组的时候,往往需要些很长的定义。比如我们想要一个10 * 10的数组:
但是在Numpy当中就会很方便,只需要一行。
第一行当中我们引入了numpy,为了编码方便,我们将它重新命名成了np。这个是业内惯用做法,几乎所有使用numpy的程序员都会这么重命名。
在numpy当中,存储高维数组的对象叫做ndarray,与之对应的是存储矩阵的mat。其实这两者区别不大,支持矩阵的运算,ndarray基本上也都支持。我们有这么一个印象即可,关于mat内容我们会在之后介绍。
我们创建除了ndarray之后,关于获取ndarray基本信息的api大概有下面四个。
第一个是通过.ndim查看ndarray的维度,也就是查看这是一个几维的数组:
第二个是通过.shape获取这个ndarray在各个维度的大小:
第三个是通过.dtype获取这个ndarray中元素的类型:
最后一个是tolist()方法,可以将一个ndarray转化成Python原生的list进行返回。
ndarray
那么我们怎么创建numpy中的ndarray呢?
大概也有几种办法,首先,既然numpy中的ndarray可以转换成Python原生的list,同样Python中原生的list也可以转换成numpy中的ndarray。
和转换变量类型的语法很像,我们通过np.array()转换即可。
除了通过Python中原生的list转换,我们还可以根据自己的需要创建新的ndarray。numpy创建array的方法有很多,我们先来介绍一下其中比较基础的几种。
创建出一个range
np.arange可以生成一个序列,有些类似于Python中原生的range。不过它更加灵活,我们可以之传入一个整数,它会返回一个从0开始的序列:
我们也可以指定首尾元素和间隔,numpy会自动帮我们生成一个等差序列:
除此之外,numpy中还提供了ones和zeros两个api,可以生成全为0和全为1的元素。
我们还可以使用eye或者是identity生成一个N*N的单位矩阵:
除此之外,还有一个full的api可以指定shape和数值,用我们指定的数值填充出一个指定大小的数组来:
但是这个api我们用的不多,因为我们可以用ones生成一个全为1的数组,然后乘上一个我们想要的值,就等价于full。
另外,ones, zeros, full这几个api还有一个对应的like方法。所谓的like方法就是我们传入另外一个ndarray代替shape,numpy会根据这个ndarray的形状生成一个对应形状的新array。
我们来看个例子吧,首先我们生成一个顺序的序列:
然后我们通过zeros_like方法生成一个同样大小的全为0的矩阵:
它其实等价于:
其他几个like方法也大同小异,因为可替代性很强,所以我也用的不多。
numpy支持的类型
numpy支持的数据类型很多,除了常用的int和float之外,还支持复数类型的complex,某种程度上来说和golang支持的类型比较接近。
其中int类型一共分为int8,int32,int64和int128,其中每一种又分为带符号的和不带符号的。例如int8就是带符号的8位二进制表示的int,而uint8则是不带符号位的。浮点数没有无符号浮点数,一共分为float16,float32,float64和flaot128。
复数也有三种,分别是complex64,complex128和complex256。除此之外还有string_和object以及unicode_这三种类型。
我们可以通过调用astype方法更改ndarray中所有变量的类型:
除了人为转换之外,我们还可以在创建的时候通过dtype这个参数来表示我们想要创建的数据的类型,这样可以避免之后转换的麻烦。
结尾
这篇文章当中我们不仅介绍了Numpy的创建的方法,还聊了Python这门语言的一些特性。正是因为Python本身多线程的限制,导致它在需要高并发计算的场景下性能很差。才会需要通过Python去调用C++或者是其他语言的底层实现。这也是为什么Python经常被称为胶水语言的原因。
Numpy可以认为是Python进行机器学习的基础,当然除了Numpy之外,像是pandas、matplot以及scikit-learn等库也是必不可少的。我们会从Numpy开始,一点一点把这些常用的库都给大家分享一遍。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-13
本文作者:承志
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2020年,应届生想要拿到上万的web前端offer,这8个技能必不可少!
如今前端开发的任职要求越来越高了,不仅要掌握 javascript,熟悉vue、react等各种框架,甚至连后端和 python 都得懂。 前几年只要熟练HTML、CSS、JavaScript ,靠扒代码套用代码工具就能找到一份相对不错的工作,看来现在这套是行不通了。 要是碰上面试官问你“Vue数据绑定的原理是什么?React中的Fiber到底是什么?如何控制Promise任务的并发数?Nodejs如何处理高并发?......”,也别觉得夸张,连这些基本内容都有些吃力,那你很有必要重新审视自己的核心技术水平了。 估计小伙伴都出现过这样的困惑: 1、从事前端行业多年,但技术上总感觉不够深入,且很难再有提升; 2、了解多个单独的技术点,但缺乏体系化,没办法串起来; 3、停留在使用框架/工具上,很难基于业务场景来提出新的模型; 4、对于新框架和语言的出现缺乏敏感度,前沿的技术了解不够深入; 5、想进入大厂,如阿里,百度,头条等; 现在前端已进入技术深水区,发展也常涉及到后端、人工智能领域及物联网等多个层面。在目前这个行业阶段要是只会套代码、不懂源码,实在太吃亏了。 因此,为了让大家能拓宽知识...
- 下一篇
web前端零基础,按照这样的学习步骤,6个多月找到了工作【干货】
关键词“零基础”和“迅速”,针对这两个词,我们就应该相应的学习规划。首先你是一个零基础的人,现在急需把web前端相关技能学好,在“保证学习质量”的同时用最短的时间学好web前端应该掌握的必要技术。 具体实行方案如下: 1.了解web前端市场需求 首先,零基础的人应该去了解目前想要找到一份web前端的工作,应该具备哪些技能,当你符合这些企业的基本标准后,工作就不成问题。先知道自己应该达到什么标准,然后再去学习,不学无用的知识,只学工作需求大的知识,这可以避免浪费时间,这方面小编不浪费口舌多说,可以到招聘网站多去搜集一些,或者来问我。 2.制定计划 既然想在短时间学好web前端技术,那么就应该运筹帷幄,如果你连一个明确的规划都没有,那很难说你能比别人做的更好,用更短的时间学好应该掌握的那些技术,一个好的规划非常重要,有很多人学习的时候就很混乱,结果必然不好。能每天按照计划完成的人并不多,这需要你个人的自律性,如果自己懒惰,神仙都救不了。你每天应该学习多少知识点,应该如何巩固,你要很明确。 3.辅助工具 想学好web前端技术,无论个人能力多么出众,一定要有好的装备,那么对于学习web前端来说...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)