前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python】NumPy快速入门

【Python】NumPy快速入门

作者头像
ZifengHuang
发布2020-07-29 15:49:01
7030
发布2020-07-29 15:49:01
举报
文章被收录于专栏:未竟东方白未竟东方白

今天刚好来看机器学习,结果就踩到了这个坑。本来目标是看PyTorch的,结果由于一份教程的开头有一句“本教程默认已有NumPy基础”而跑去看NumPy了。喜闻乐见,其实并没有看NumPy的必要,但是毕竟也简单看完记了不少笔记,就发出来算了。

这篇只是非常非常简单的介绍,内容少,只能使看到其代码是不会懵。且由于是从笔记上摘回,所以可能会有些混乱。

一.安装

NumPy是一个Python用于数值计算的库,这个库由于提供了许多科学计算的函数,强大的矩阵处理能力和极高的运行效率而在机器学习领域被广泛使用。配合NumPy的Python也可以得到媲美Matlab的矩阵处理和数学计算效果,再配合SciPy(Scientific Python)和 Matplotlib(绘图库)两个库Python便成为了几乎可以替代Matlab的存在。而在这篇里面,主要是简单介绍下NumPy的数组用法,这也是对于机器学习最重要的组件。

那么首先是NumPy的安装,其他的安装方法多比较繁琐,这里有一个最简单的方法,依据下图的步骤进入Python的文件夹,然后使用easy_install安装pip,再然后升级下pip并使用pip联网下载自动安装NumPy即可,过程十分简单。

安装完后在Python里使用import numpy as np 导入库即可

二.创建数组

首先使用np.array()可以简单创建作为替代数组元素的Ndarray对象,这个对象是NumPy最重要的东西,是一切运算的基本,大多数函数的返回值。array参数可以是很多暴露了数组接口的对象,其中有个参数order可以控制创建的对象将为C风格的行优先还是F风格(Fortran)的列优先。下图就是简单的创建数组。

然后从数组a得到了对象b后,我们可以使用b.size得到大小,b.shape得到形状,b.ndim得到维度,b.dtype得到数据类型,效果又如下。

这即是NumPy最最基本的操作了,由于NumPy大量学习了Matlab的写法,我们不但可以将这个得到的数组对象进行许多类似与Matlab的操作,也可以使用许多类似Matlab的函数来创建特殊的数组(矩阵),只不过在这里这些函数都要依据最开始导入得到的库对象np来实现。

例如类似Matlab里,我们可以使用ones创建全为浮点1的矩阵(参数是一个描述矩阵大小的数组),zeros得到0矩阵,rand得到均匀分布的随机矩阵,uniform得到指定范围内的随机数,randint得到指定范围内的随机整数,normal得到正态随机矩阵(此处的参数是均值,标准差,维度)

三.数组的运算

创建好数组后对于数组的操作都和Matlab一样,通过冒号运算符可以很方便地得到数组的切片。然后使用reshape函数就可以很方便地将数组进行形状改变,但要求数组的变形前后元素数量不变。

正如Matlab可以方便地对数组运算一样,NumPy也提供了方便的方法。首先数组直接支持数乘与加减,只要直接使用运算符即可,这也就是数学上的点对点运算,例如点乘。

而数组的叉乘则是使用dot函数,这很神奇,我认为并不是一个好设计,这与后面的矩阵有关。

四.数组的操作

首先NumPy的条件判断运算可以将数组转换为Boolean值,而三目运算配合where操作则可以方便地替换数组元素为指定值,这个操作对机器学习很有用。

然后对于我们朝思慕想的数组的拼接则没有Matlab那么方便了。对于垂直拼接,需要使用vstack函数,而想要水平拼接的话则需要使用hstack函数,不过也不算麻烦。

而对于我们常用的统计运算则是使用amax函数可以得到指定轴(axis)的最大值,相应的amin可以得到最小值,mean得到轴平均值,std得到轴方差。都是些基本而实用的运算。其中指定轴的方法是函数的axis参数,参数从0开始计算轴,例如0为列方向1为行方向。可以看出NumPy的操作并不算复杂。

五.矩阵matrix

前面提到了一下的矩阵matrix是个奇怪的设计,不是一样的东西么?实际上,NumPy为了方便从Matlab迁移过来Python阵营的人,对这两种类似的东西提供了两个对象。我们可以利用mat函数来创建矩阵对象,创建这个对象主要是方便真正的矩阵运算(少数函数要求参数为matrix)与其他一些线性运算。

可笑的是官方后来比较推荐的是使用二维的ndarray来替代matrix,因为ndarray 更灵活且效率更高,只不过有些操作matrix写起来更方便些而已。两者可以通过asarray和asmatrix进行相互转换。

matrix只有二维的,并不支持多维矩阵,所以要用到多维时还得用数组ndarray。

说了那么多matrix的缺点,matrix的优点呢?就是更加类似于Matlab的操作。首先matrix中乘号*表示矩阵的叉乘,而点乘需要使用multiply函数,这点更接近于Matlab。其次刚才没有提到array的求逆之类的操作,因为array经常需要多一步才能得到。例如用np.linalg.det可以得到行列式,使用np.linalg.inv可以得到逆矩阵,相比之下matrix可以使用.H操作得到共轭矩阵,用.I得到逆矩阵。不过对于两者都可以使用.T得到其转置矩阵。

当然这一切并不能改变我对这个设计的不爽。

六.其他

刚才上面提到的np.linalg是NumPy提供的线性代数模块,其中还有值得一提的还有solve函数提供了求解矩阵方程的能力,eig求特征值与特征向量,lstsq求最小二乘解,diag求对角线。

还有一点NumPy自然也提供了对应的迭代器np.nditer(),参数是数组,order指定优先级。关于迭代的操作与其他迭代器相同,迭代的默认优先级是行优先的。

七.后记

虽然这只是个较为小型的库,可是还是有很多的api我没有介绍,个人看到的感觉常用的就是上面的那些。许多在Matlab中提到的操作都可以对应过来在np中找到,例如sin,cos,sum等函数,详细的可以看我看的两篇好文章和官方的文档:

https://www.jianshu.com/p/57e3c0a92f3a 简单的api介绍与入门

https://blog.csdn.net/cxmscb/article/details/54583415 更为详细的api列表

https://docs.scipy.org/doc/numpy/user/quickstart.html 英文的入门文档

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未竟东方白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档