本文始发于我的公众号:TechFlow,原创不易,求个关注web
今天是Numpy专题第6篇文章,咱们一块儿来看看Numpy库当中剩余的部分。api
在咱们作机器学习模型的研究或者是学习的时候,在完成了训练以后,有时候会但愿可以将相应的参数保存下来。不然的话,若是是在Notebook当中,当Notebook关闭的时候,这些值就丢失了。通常的解决方案是将咱们须要的值或者是数组“持久化”,一般的作法是存储在磁盘上。数组
Python当中读写文件稍稍有些麻烦,咱们还须要建立文件句柄,而后一行行写入,写入完成以后须要关闭句柄。即便是用with语句,也依然不够简便。针对这个问题,numpy当中自带了写入文件的api,咱们直接调用便可。网络
经过numpy当中save的文件是二进制格式的,因此咱们是没法读取其中内容的,即便强行打开也会是乱码。并发
以二进制的形式存储数据避免了数据类型转化的过程,尤为是numpy底层的数据是以C++实现的,若是使用Python的文件接口的话,势必要先转化成Python的格式,这会带来大量开销。既然能够存储,天然也能够读取,咱们能够调用numpy的load函数将numpy文件读取进来。dom
要注意咱们保存的时候没有添加文件后缀,numpy会自动为咱们添加后缀,可是读取的时候必需要指定文件的全名,不然会numpy没法找到,会引起报错。机器学习
不只如此,numpy还支持咱们同时保存多个数组进入一个文件当中。编辑器
咱们使用savez来完成,在这个api当中咱们传入了a=arr,b=arr,实际上是以相似字典的形式传入的。在文件当中,numpy会将变量名和数组的值映射起来。这样咱们在读入的时候,就能够经过变量名访问到对应的值了。函数
若是要存储的数据很是大的话,咱们还能够对数据进行压缩,咱们只须要更换savez成savez_compressed便可。学习
Numpy除了科学计算以外,另一大强大的功能就是支持矩阵运算,这也是它广为流行而且在机器学习当中大受欢迎的缘由之一。咱们在以前的线性代数的文章当中曾经提到过Numpy这方面的一些应用,咱们今天再在这篇文章当中汇总一些经常使用的线性代数的接口。
提及来矩阵点乘应该是最经常使用的线代api了,好比在神经网络当中,若是抛开激活函数的话,一层神经元对于当前数据的影响,其实等价于特征矩阵点乘了一个系数矩阵。再好比在逻辑回归当中,咱们计算样本的加权和的时候,也是经过矩阵点乘来实现的。
在Andrew的深度学习课上,他曾经作过这样的实现,对于两个巨大的矩阵进行矩阵相乘的运算。一次是经过Python的循环来实现,一次是经过Numpy的dot函数实现,二者的时间开销相差了足足上百倍。这当中的效率差距和Python语言的特性以及并发能力有关,因此在机器学习领域当中,咱们老是将样本向量化或者矩阵化,经过点乘来计算加权求和,或者是系数相乘。
在Numpy当中咱们采用dot函数来计算两个矩阵的点积,既能够写成a.dot(b),也能够写成np.dot(a, b)。通常来讲我更加喜欢前者,由于写起来更加方便清晰。若是你喜欢后者也问题不大,这个只是我的喜爱。
注意不要写成*,这个符号表明两个矩阵元素两两相乘,而不是进行点积运算。它等价于np当中的multiply函数。
转置咱们曾经在以前的文章当中提到过,能够经过.T或者是np.transpose来完成。
Numpy中还提供了求解逆矩阵的操做,这个函数在numpy的linalg路径下,这个路径下实现了许多经常使用的线性代数函数。根据线性代数当中的知识,只有满秩的方阵才有逆矩阵。咱们能够经过numpy.linalg.det先来计算行列式来判断,不然若是直接调用的话,对于没有逆矩阵的矩阵会报错。
在这个例子当中,因为矩阵b的行列式为0,说明它并非满秩的,因此咱们求它的逆矩阵会报错。
除了这些函数以外,linalg当中还封装了其余一些经常使用的函数。好比进行qr分解的qr函数,进行奇异值分解的svd函数,求解线性方程组的solve函数等。相比之下,这些函数的使用频率相对不高,因此就不展开一一介绍了,咱们能够用到的时候再去详细研究。
Numpy当中另一个经常使用的领域就是随机数,咱们常用Numpy来生成各类各样的随机数。这一块在Numpy当中其实也有不少的api以及很复杂的用法,一样,咱们不过多深刻,挑其中比较重要也是常用的和你们分享一下。
随机数的全部函数都在numpy.random这个路径下,咱们为了简化,就不写完整的路径了,你们记住就好。
这个函数咱们常常在代码当中看到,尤为是咱们造数据的时候。它表明的是根据输入的shape生成一批均值为0,标准差为1的正态分布的随机数。
要注意的是,咱们传入的shape不是一个元组,而是每一维的大小,这一点和其余地方的用法不太同样,须要注意一下。除了正态分布的randn以外,还有均匀分布的uniform和Gamma分布的gamma,卡方分布的chisquare。
normal其实也是生成正态分布的样本值,但不一样的是,它支持咱们指定样本的均值和标准差。若是咱们想要生成多个样本,还能够在size参数当中传入指定的shape。
顾名思义,这个函数是用来生成随机整数的。它接受传入随机数的上下界,最少也要传入一个上界(默认下界是0)。
若是想要生成多个int,咱们能够在size参数传入一个shape,它会返回一个对应大小的数组,这一点和uniform用法同样。
shuffle的功能是对一个数组进行乱序,返回乱序以后的结果。通常用在机器学习当中,若是存在样本汇集的状况,咱们通常会使用shuffle进行乱序,避免模型受到样本分布的影响。
shuffle是一个inplace的方法,它会在本来值上进行改动,而不会返回一个新值。
这也是一个很是经常使用的api,它能够在数据当中抽取指定条数据。
可是它只支持一维的数组,通常用在批量训练的时候,咱们经过choice采样出样本的下标,再经过数组索引去找到这些样本的值。好比这样:
今天咱们一块儿研究了Numpy中数据持久化、线性代数、随机数相关api的使用方法,因为篇幅的限制,咱们只是选择了其中比较经常使用,或者是比较重要的用法,还存在一些较为冷门的api和用法,你们感兴趣的能够自行研究一下,通常来讲文章当中提到的用法已经足够了。
今天这篇是Numpy专题的最后一篇了,若是你坚持看完本专题全部的文章,那么相信你对于Numpy包必定有了一个深刻的理解和认识了,给本身鼓鼓掌吧。以后周四会开启Pandas专题,敬请期待哦。
若是喜欢本文,能够的话,请点个关注,给我一点鼓励,也方便获取更多文章。
本文使用 mdnice 排版