作者:韩信子@ShowMeAI教程地址:http://www.showmeai.tech/tutorials/33文章地址:http://www.showmeai.tech/article-detail/142免责声明:版权所有,转载请联系平台和作者并注明出处n维数组是NumPy的核心概念,大部分数据操作都是基于n维数组。本系列内容涵盖1维数组运算、2维数组运算、3维数组运算。本文介绍Numpy和一维数组操作。1.向量初始化您可以从Python列表创建NumPy数组。如(a)所示,将列表元素转换为一维数组。注意,一般要保证列表元素类型相同,否则默认的dtype='object'会影响后续操作,甚至会导致语法错误。NumPy数组不能像Python列表那样增长,因为数组末尾没有预留空间来快速添加新元素。因此,通常的处理方法包括:将数据准备在一个变长的Python列表中,然后将其转换为NumPy数组,使用np.zeros或np.empty预先分配必要的空间(图中b)通过图中的方法(c),可以创建一个与变量形状相同的空数组。不仅仅是空数组,数组也可以通过上面的方法填充特定的值:在NumPy中,数组也可以通过单调序列来初始化:如果我们需要浮点数组,可以使用arange(3).astype(float)这样的操作改变arange输出的类型,也可以在参数端使用浮点数,比如arange(4.)产生浮点数的Numpy数组。以下是arange浮点型数据可能出现的一些问题及解决方法:图中0.1对我们来说是有限十进制数,但对计算机来说是二进制无限小数,必须四舍五入取一个近似值.因此,使用小数作为arange的步长可能会导致一些错误。可以通过两种方式避免上述错误:使区间结束落入非整数步数,但这会降低可读性和可维护性;使用linspace,它避免了舍入误差的影响,并始终生成请求的元素数。使用linspace时,需要特别注意lastnumber参数的设置。由于它计算的是点数,而不是区间数,所以上图中的number参数是11,不是10。生成随机数组的方法如下:2.向量索引NumPy可以很直接的访问数组数据:图中除了“花式索引”,其他的索引方法本质上都是视图:它们不存储数据,如果原数组被索引后发生变化,则将反映原数组的变化。上述所有这些方法都可以改变原始数组,即允许通过分配新值来更改原始数组的内容。这使得不可能通过切片来复制数组。下面是python列表和NumPy数组的对比:NumPy数组支持通过布尔索引获取数据,结合各种逻辑运算符,可以有非常高级的数据选择方式,这是Python列表所没有的:注意不能使用3Python“三元”比较,如<=a<=5。如上所述,布尔索引是可写的。如下图所示,有两个私有函数np.where和np.clip。3、向量运算NumPy支持快速计算,向量运算运算接近C++速度水平,不受Python循环本身计算速度慢的限制。NumPy允许像普通数字一样操作整个数组:在python中,a//b表示adivb(除法的商),x**n表示x?浮点数的计算也是如此,NumPy是能够将标量广播到数组:Numpy提供了许多数学函数来处理向量:向量点积(内积)和叉积(外积,向量积)如下:NumPy还提供了以下三角函数运算:数组是整体四舍五入:floor向上取整,ceil向下取整,roundroundingnp.around和np.round是等价的,这里只是为了避免和Pythonaroundwhenfromnumpyimport*冲突(不过一般用法是importnumpyasNP).当然你也可以使用a.round()。NumPy还可以实现以下函数:以上函数都有相应的耐nan变体:如nansum、nanmax等NumPy中对排序函数函数进行了阉割:对于一维数组,可以通过倒序函数求解通过反转结果,但问题在二维数组中变得棘手。4.查找向量中的元素NumPy数组没有Python列表中的index方法。index数据对比如下:index()中的方括号表示j或i&j可以省略。可以通过np.where(a==x)[0][0]来查找元素,但是这种方法非常不pythonic,即使要查找的元素在数组的开头,这种方法也需要遍历整个阵列。使用Numba实现加速查找,next((i[0]fori,vinnp.ndenumerate(a)ifv==x),-1),最坏情况下比where慢。如果数组已排序,请使用v=np.searchsorted(a,x);returnvifa[v]==xelse-1时间复杂度为O(logN),但在此之前,排序的时间复杂度为O(NlogN)。其实通过C实现加速搜索并不难,问题是浮点数据比较。5.浮点数的比较np.allclose(a,b)用于比较容差误差范围内的浮点数。np.allclose假设所有比较的数字都具有scale1。如果在纳秒级别,则需要将默认的atol参数除以1e9:np.allclose(1e-9,2e-9,atol=1e-17)==False.math.isclose不对要比较的数字做任何假设,而是要求用户提供合理的abs\_tol值(np.allclose的默认atol值1e-8足以用于比较浮点数与小数1的地方,也就是math.isclose(0.1+0.2–0.3,abs_tol=1e-8)==True。另外np.allclose对于绝对偏差和相对偏差还有一些问题,比如对于一些值a,b,allclose(a,b)!=allclose(b,a),而在math.isclose中不存在这些问题。有关更多信息,请参阅GitHub上的浮点数据指南和相应的NumPy问题信息。资料及代码下载本教程系列的代码可以在ShowMeAI对应的github上下载,可以在本地python环境下运行,会科学上网的宝宝也可以直接使用googlecolab运行和交互学习一键!本系列教程涉及的小抄可以在以下地址下载:NumPy小抄Pandas小抄Matplotlib小抄Seaborn小抄扩展参考资料NumPy教程PythonNumPy教程ShowMeAI相关文章推荐数据分析入门数据分析思维数据数学基础分析学商业认知与数据初步数据清洗与预处理商业分析与数据挖掘数据分析工具地图统计与数据科学计算工具库Numpy介绍Numpy与一维数组运算Numpy与二维数组运算Numpy与高维数组运算数据分析工具库Pandas介绍图Pandas核心操作功能全图图Pandas数据转换高级功能Pandas数据分组及操作数据可视化原理与方法基于Pandas的数据可视化seaborn工具及数据可视化ShowMeAI系列之t教程推荐图解Python编程:从入门到精通系列教程图解数据分析:从入门到精通系列教程图解AI数学基础:从入门到精通系列教程图解大数据技术:从入门到精通系列教程
