《Python程序设计基础(第2版)》课件 07Numpy科学计算库_第1页
《Python程序设计基础(第2版)》课件 07Numpy科学计算库_第2页
《Python程序设计基础(第2版)》课件 07Numpy科学计算库_第3页
《Python程序设计基础(第2版)》课件 07Numpy科学计算库_第4页
《Python程序设计基础(第2版)》课件 07Numpy科学计算库_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计基础第7章NumPy科学计算库教师:XXX第7章NumPy科学计算库7.1NumPy基础7.2存取数据元素7.3数组运算和排序7.4

NumPy的函数7.5数组组合和文件存取7.6应用实例7.1NumPy基础NumPy(NumericalPython)是一个开源Python科学计算库,是Python生态圈最重要的底层支持库,支持快速的数组运算。np是在Python中进行数据分析、机器学习、人工智能开发的必备工具。下面先用两个例子对比展示列表和数组编程方式及执行效率上的差异。【例1】将数列a和b对应位置的数相加。a=[1,2,3]b=[3,4,5]print(a+b)#输出[1,2,3,3,4,5],列表相加是连接,不是对应元素相加lst=[]forx,yinzip(a,b):#列表需用循环方式完成相加lst.append(x+y)print(lst)#输出[4,6,8]importnumpyasnp#引入numpyar1=np.array(a)#将列表转为数组ar1ar2=np.array(b)#转为数组ar2print(ar1+ar2)#输出[468],两个np数组可以直接对位相加7.1NumPy基础【例2】将含有1百万个数的列表和np数组中的数都变为原来的2倍,对比耗时lst=list(range(1000000))#列表ar=np.arange(1000000)#数组#%timeit是用于测试程序耗时的Ipython扩展命令,测试多次取平均耗时%timeitlst2=[x*2forxinlst]#测试列表耗时89.4ms±2.34msperloop(mean±std.dev.of7runs,10loopseach)%timeitar2=ar*2#测试数组耗时1.07ms±16.5µsperloop(mean±std.dev.of7runs,1000loopseach)从以上对比可见,数组运算速度比列表快很多且编程方便。7.1NumPy基础importnumpyasnpnp.__version__#版本,此处前后都是两根下画线#arange产生6个数,reshape重设为2x3数组b=np.arange(6).reshape(2,3)type(b) #numpy.ndarray#数组对象的各种特性b.ndim #数组维度2,有的书上称为秩b.size #数组中的元素个数6,和len(b)不同b.shape #数组形状(2,3)b.dtype #数组元素的数据类型dtype('int32')b.T #转置,数组行、列互换7.1.1数组对象特性7.1NumPy基础7.1.2生成数组1.使用array()生成b=np.array((1,2,3,4))#一维Out:array([1,2,3,4])b=np.array([[1,2],[3,4],[5,6]])#生成一个3x2的二维数组np.sum(b,axis=0)#按0轴(纵向)求和Out:array([9,12])np.sum(b,axis=1)#按1轴(横向)求和Out:array([3,7,11])7.1NumPy基础7.1.2生成数组2.使用arange()生成,类似range(),但支持小数步长b=np.arange(1,5)#生成1至4(不含终值5)的数组

Out:array([1,2,3,4])np.arrange(1,9,2)#步长2Out:array([1,3,5,7])np.arrange(1,4,0.5)#步长0.5Out:array([1.,1.5,2.,2.5,3.,3.5])np.repeat(b,2) #将元素重复2次Out:array([1,1,2,2,3,3,4,4])np.tile(b,3) #将数组重复3次Out:array([1,2,3,4,1,2,3,4,1,2,3,4])7.1NumPy基础7.1.2生成数组利用repeat和tile实现简单的图片变换importmatplotlib.pyplotasplt#引入绘图库,该库见第9章img=plt.imread('pic/cat.jpg')#读.jpg图片,返回一个三维数组#(高380像素,宽500像素,RGB颜色值)print(img.shape)#输出(380,500,3),三个轴的编号分别为0,1,2plt.imshow(img) #原始图片,左图plt.imshow(np.repeat(img,2,axis=1))#将横轴1重复2次,图片横向拉伸plt.imshow(np.repeat(img,3,axis=0))#将纵轴0重复3次,纵向拉伸,中图plt.imshow(np.tile(img,(2,1,1)))#将纵轴平铺2次,横轴和颜色轴不变(1倍)plt.imshow(np.tile(img,(2,2,1)))#纵横轴均平铺2次,颜色轴不变(1倍),右图7.1NumPy基础3使用ones()/zeros生成全0、全1数组np.ones(5) #生成含有5个元素的一维全1数组np.ones((2,3)) #生成2x3的二维全1数组np.zeros((2,3)) #生成2x3的二维全0数组np.ones_like(b) #生成维数和b相同的全1数组np.eye(3) #单位矩阵数组np.linspace(1,2,5) #[1,2]间均匀分布5个数Out:array([1.,1.25,1.5,1.75,2.]) #默认含终值#[0,π]间均匀分布7个数,即间隔30度,计算正弦值并保留2位小数np.sin(np.linspace(0,np.pi,7)).round(2)Out:array([0.,0.5,0.87,1.,0.87,0.5,0.])np.linspace(1,2,5,endpoint=False) #False表示不含终值Out:array([1.,1.2,1.4,1.6,1.8])4.linspace()生成等差数组7.1NumPy基础5.使用随机函数生成数组ar=np.random.rand(3,4) #3x4数组,[0,1)内均匀分布小数np.set_printoptions(precision=3) #小数部分显示3位np.random.randint(1,100,5) #[1,100)内5个随机整数,不含100np.random.randint(1,100,(2,3)) #2x3数组np.random.randn(10,20) #10x20的标准正太N(0,1)数组#符合正态分布N(1,4)的30x100数组,

loc均值,scale标准差x=np.random.normal(loc=1,scale=2,size=(30,100))x.std(),x.var(),x.mean() #标准差,方差,均值7.1NumPy基础7.1.3NumPy的数据类型(与C的类型类似)类

名描

述bool布尔类型(值为True或False)int由所在平台决定其精度的整数(一般为int32或int64)int88位整数,范围为-128~127int1616位整数,范围为-32768~32767int3232位整数,范围为-231~231-

1int6464位整数,范围为-263~263-

1uint8无符号8位整数,范围为0~255uint16无符号16位整数,范围为0~65535float16半精度浮点数(16位):1位符号位,5位指数,10位尾数float32单精度浮点数(32位):1位符号位,8位指数,23位尾数float64双精度浮点数(64位):1位符号位,11位指数,52位尾数complex64复数,分别用两个32位浮点数表示实部和虚部b=np.arange(5,dtype='float')#可以在创建时指定数据类型

7.1NumPy基础创建数组时可以用dtype参数指定数据类型。已有的数组可以用astype()方法转换类型。数组元素的类型一般应相同,而列表的元素类型允许不同。In:b=np.arange(5)Out:array([0,1,2,3,4]) In:b.dtypeOut:dtype('int32')#默认'int32'类型In:b[0]=8.5 #由于是整型,赋小数时只保留整数8Out:array([8,1,2,3,4])In:c=np.arange(5,dtype='float32')#指定为'float32'In:c[0]=8.5In:np.full(5,1,dtype='bool')#创建布尔数组,1为真,全为TrueOut:array([True,True,True,True,True])#将数组c的数据由float32转换为int32类型,存为数组b,c保持不变b=c.astype('int32')7.1.3NumPy的数据类型7.2存取数组元素7.2.1基本索引和切片操作np数组可按类似列表访问的语法,单个索引或切片访问。b=np.arange(5,10) #array([5,6,7,8,9])b[1],b[-1],b[:2],b[1:3] #(6,9,array([5,6]),array([6,7]))b[[0,1,3]] #花式索引array([5,6,8]),复制重要:数组切片和列表切片不同,前者是视图,后者是复制。#下例演示NumPy数组切片和原数组共享内存b=np.arange(5,10) #array([5,6,7,8,9])c=b[0:3] #产生视图,b,c指向同一内存块c[0]=100 #此修改将同时影响b和cc #array([100,6,7])b #array([100,6,7,8,9])c=b[0:3].copy()

#复制数组,这样b,c分离,不会相互影响7.2.2二维数组的索引操作二维数组分行、列两个维度,用[行,列]、[行]、[:,列]访问。b=np.arange(12).reshape(3,4)Out:array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])b[1,2] #6,也可写为b[1][2]b[1,1:3] #array([5,6])b[1] #array([4,5,6,7])b[:,1] #array([1,5,9])b[1:3,1:4] #array([5,6,7],[9,10,11])b[[0,1,2],[3,2,1]]#array([3,6,9]),将行/列坐标分别排列,花式索引补充:np.tril(b)下三角矩阵,np.triu(b)上三角矩阵7.2.3布尔索引布尔索引:筛选出True值对应位置的数据,很有用。#设种子7,相同的种子可确保随机数按序生成时是相同的,结果可重现np.random.seed(7)b=np.random.randint(40,100,size=10) #生成10个随机整数Out:array([87,44,65,94,43,59,63,79,68,97])c=b<60 #生成一个布尔数组cOut:array([False,True,False,False,True,True,False,False,False,False])b[c] #利用布尔索引取数据,得到<60的数据Out:array([44,43,59])b[(b>=60)&(b<=80)] #显示60~80间的数据,此处用&,不能用andb[(b<60)|(b>90)] #显示<60或>90的数据,此处用|,不能用orb[~(b<60)] #~非,显示>=60的数据b[b<60]=60#将<60的数据都改为607.2.3布尔索引布尔索引应用示例:筛选出True值对应位置的数据。b=np.array((60,70,75,90,68,89)) #成绩c=np.array((1,1,1,2,2,2)) #班级b[c==1].mean() #1班平均成绩x=np.array((70,75,92,68,89)) #评分1y=np.array((75,69,93,70,85)) #评分2np.where(x>y,x,y) #取x/y两两比较的较大值np.where(x>80,1,0) #x>80则取1,否则取0np.where(x>80) #array([2,4]),>80的数据的序号np还有一个按条件选取数据的where(condition,x,y)函数,condition是布尔数组,其值为真取数组x值,为假取y值。x=np.array([0,1,2,3,4])y=np.array([10,11,12,13,14])c=np.array([True,True,False,False,True])np.where(c,x,y) #从x中取第0,1,4个值,从y中取第2,3个值Out:array([0,1,12,13,4])7.3数组运算和排序7.3.1数组和单个数据的运算数组和单个数据可直接运算,不需要编写循环程序处理。b=np.arange(5) #array([0,1,2,3,4])b+2 #array([2,3,4,5,6])b*3 #array([0,3,6,9,12])7.3.2数组广播运算1.数组形状相同时的运算两个数组形状(shape)相同时,各位置上的元素对位运算。a1=np.arange(5) #array([0,1,2,3,4])

a2=np.arange(5,10) #array([5,6,7,8,9])

a1+a2 #array([5,7,9,11,13])a1*a2 #array([0,6,14,24,36])7.3数组运算和排序7.3.2数组广播运算2.数组形状不同时的广播运算当两个数组形状(shape)不同时,如果能按广播规则扩展为同形状的数组,则可以运算,如不符合广播规则就不能运算。a1=np.arange(4) #一维(4,)

a2=np.arange(12).reshape(3,4) #二维(3,4)

a1+a2 7.3数组运算和排序2.数组形状不同时的广播运算上例中的a1是一维数组(4,),a2是(3,4)的二维数组,两者的维数不同。a1维数较小,NumPy在a1的维数前面加1补齐,a1形状变为(1,4)。现在a1的第0维是1,a2的第0维是3,NumPy将把a1的第0维扩充为3,相当于将a1的形状变为(3,4),可近似认为a1在内存中被调整为如下形状:array([[0,1,2,3],[0,1,2,3],[0,1,2,3]]这样,a1和a2的形状一致,就可以完成a1+a2的运算。7.3数组运算和排序广播规则具体如下:(1)参加运算的数组都向维数最大的数组看齐,维数较小的数组在前面加1补齐。(2)结果数组的形状(shape)取各运算数组的各个轴上的最大值。(3)若运算数组的某个轴的长度为1,则该轴可扩充为结果数组的对应轴的长度。若轴的长度不为1,则不能扩充。(4)检查扩充后所有运算数组对应的轴的长度。若长度都相同则符合广播规则可以计算,否则违反规则无法计算。b1=np.arange(3).reshape(3,1)b2=np.arange(10,12).reshape(1,2)b1+b2#符合规则,可广播计算形状为(3,)和2x1的两个数组可运算,结果数组形状为2x3。形状为3x1和1x2的两个数组可运算,结果数组形状为3x2。形状为2x3和3x2的两个数组不满足规则,无法计算。形状为2x3和4x3的数组也无法计算。7.3.3数组排序数组自带sort()排序方法,默认从小到大排列。np.random.seed(7)b=np.random.randint(1,20,size=10)Out:array([16,5,4,8,15,9,15,11,9,8])c=b.copy() #备份数组bb.sort() #排序后将改变数组b

b=c.copy() #从备份中恢复bd=np.sort(b) #np.sort不改变数组本身,返回新的有序数组arg=np.argsort(b) #argsort返回代表原数据顺序的有序下标数组Out:array([2,1,3,9,5,8,7,4,6,0],dtype=int64)#最小数是第2个数b[arg] #array([4,5,8,8,9,9,11,15,15,16])b[arg[0]],b[arg[-1]]#抽取最小和最大的数

数组排序不支持列表的reverse=True参数,要从大到小排如下所示:b[np.argsort(-b)] #注意-bOut:array([16,15,15,11,9,9,8,8,5,4])7.3.3数组排序多维数组排序:可指定axis=0(纵向)或1(横向),默认按最后一个轴排序。np.random.seed(7)b=np.random.randint(1,50,size=15).reshape(3,5)Out:array([[48,5,26,4,20],[24,40,29,15,24],[9,26,47,43,27]])np.sort(b) #默认按最后一个轴(axis=1),水平方向排序Out:array([[4,5,20,26,48],[15,24,24,29,40],[9,26,27,43,47]])np.sort(b,axis=0) #axis=0在竖直方向上排序Out:array([[9,5,26,4,20],[24,26,29,15,24],[48,40,47,43,27]])数组小练习1.分别生成2x3的全0,全1,全True的数组。np.zeros((2,3))np.ones((2,3))np.full((2,3),True)2.b=np.array([1,3,14,5,6,7,12,9])(1)取出所有的偶数值 b[b%2==0](2)取出所有偶数索引序号的数据 b[::2](3)将所有的奇数都改为7 b[b%2==1]=7(4)>10的数出现在哪些位置 np.where(b>10)3.c=np.arange(24).reshape(4,6)(1)取c的倒数3列 c[:,-3:](2)取出5-12之间的数 c[(c>=5)&(c<=12)](3)将偶数行数据全置0 c[::2]=04.b=np.array([1,3,7,np.nan,np.nan])(1)有几个nan值 np.isnan(b).sum()(2)将nan值都置0 b[np.isnan(b)]=0补充:数组应用图片简单变换(互补色,左右反转,上下反转,隔行画线等)importnumpyasnpfromPILimportImageim=Image.open('cat.jpg')#图片a=np.array(im)#数组#高x宽x颜色,数据类型,(0,0)点颜色值print(a.shape,a.dtype,a[0,0,:])#(136,178,3)b=255-a#互补色RGB(255,0,0)im=Image.fromarray(b.astype('uint8'))im.save('cat2.jpg')c=a.copy()c[::2]=0#黑色横条Image.fromarray(c).save('cat3.jpg')c=a.copy()c[:,::2]=255#白色竖条Image.fromarray(c).save('cat4.jpg')cat2.jpgcat.jpgcat3.jpgcat4.jpg补充:数组应用#上下颠倒Image.fromarray(a[::-1]).save('cat5.jpg')#左右交换Image.fromarray(a[:,::-1]).save('cat6.jpg')#水平组合Image.fromarray(np.hstack((a,a))).save('cat7.jpg')#垂直组合Image.fromarray(np.vstack((a,a))).save('cat8.jpg')数组应用:图片简单变换cat5.jpgcat6.jpgcat7.jpgcat8.jpg补充:数组应用数组应用:图片简单变换#用tile平铺:纵/横轴都为2倍,颜色轴为1倍不变Image.fromarray(np.tile(a,(2,2,1))).save('cat9.jpg')#用repeat重复1轴2次Image.fromarray(np.repeat(a,2,axis=1)).save('cat10.jpg')c=a.transpose((1,0,2))#轴变换,原0/1轴(横纵轴)交换,2轴不变Image.fromarray(c).save('cat11.jpg')cat9.jpgcat10.jpgcat11.jpg7.4NumPy函数numpy提供了很多ufunc通用函数,可一次性对整个数组进行计算,无须编写循环处理。格式:np.函数(数组)或

数组.函数()7.4.1常用函数有max()、min()、ptp()、sum()、var()、std()等,详见教材表7.2np.random.seed(7)b=np.random.randint(1,20,size=8)#array([16,5,4,8,15,9,15,11])np.max(b),np.min(b),np.mean(b)#最大值、最小值、平均值np.ptp(b) #ptp返回数据极差12,即最大值-最小值np.quantile(b,[0.25,0.5,0.75]) #返回分位点对应的分位数np.unique(b)#返回数组b的各唯一取值np.corrcoef(a,b)#计算数组a,b的相关系数np.cov(a,b)#计算数组a,b的协方差一些常用函数也可写为"数组.函数()"的形式b.max(),b.min(),b.ptp(),b.sum(),b.mean()b.var(),b.std(),np.median(b)#方差、标准差、中位数b.argmax(),b.argmin() #最大值、最小值所对应的索引下标7.4NumPy函数对于二维数组,计算时可指定计算的轴axis=0/1。b=np.arange(10).reshape(2,5)Out:array([[0,1,2,3,4],[5,6,7,8,9]])np.sum(b) #未指定轴,计算所有数据的和Out:45np.sum(b,axis=0) #指定轴axis=0,行,沿竖直方向求和Out:array([5,7,9,11,13])np.sum(b,axis=1) #指定轴axis=1,列,沿水平方向求和Out:array([10,35])#函数应用举例np.random.seed(7)k=np.random.randint(40,100,(50,4))#50x4成绩np.mean(k,axis=0) #求科目平均分stu=np.mean(k,axis=1) #求每个学生的平均分stu.max() #学生最高平均分stu.argmax() #最高平均分学生对应的序号stu.argsort() #按分数从低到高排名对应的序号7.4NumPy函数缺失值:nan表示缺失值,如数组中含有nan,则函数运算结果为nan。b=np.array([1,2,np.nan,np.nan,3]) #构造含有nan值的数组np.sum(b) #含有nan值的数组,运算后返回nannp.nansum(b),np.nanmean(b)#这些函数可忽略nan值进行计算np.isnan(b) #isnan()测试是否nan值Out:array([False,False,True,True,False])np.isnan(b).sum() #计算nan值个数,True被视为1,结果2b[~np.isnan(b)] #取出非nan的值c=np.arange(1,6) #array([1,2,3,4,5])d(c) #累乘函数,

120np.cumprod(c) #累乘并给出中间结果array([1,2,6,24,120])np.cumsum(c) #累加并给出中间结果Out:array([1,3,6,10,15],dtype=int32)7.4NumPy函数b=np.array([1,3,3,5,5,7,8])np.unique(b) #返回不重复的元素值array([1,3,5,7,8])np.all(b) #b所有元素都为非0的真值则返回Truenp.any(b) #b有任意元素为非0值则返回TrueNumPy还提供实现矩阵乘法运算的dot()函数。a=np.arange(6).reshape(2,3)b=np.arange(6,12).reshape(3,2)#

点积,写为a@b亦可np.dot(a,b)#2x3和3x2数组做矩阵乘法,结果为2x2数组。Out:array([[28,31],[100,112]])7.4.2随机函数函

名函数描述seed()设置随机数种子rand(d0,d1,…,dn)返回[0,1)间的符合均匀分布的随机小数数组randn(d0,d1,…,dn)返回符合标准正态分布N(0,1)的随机小数数组randint(low,high,size)返回[low,high)间的随机整数数组random(size=(m,n))返回[0,1)间的mxn维度的随机小数数组choice(a,n)从数组a中随机选择n个数normal(loc,scale,size)返回符合正态分布N(loc,scale2)的随机数uniform(low,high,size)产生指定区间均匀分布的样本值

np.random随机数模块np.random.seed(7) #设置随机数种子np.random.rand(2,3) #2x3小数数组b=np.random.randint(1,100,20)#返回[1,100)内20个随机整数np.random.choice(b,5) #从b中随机抽5个数据7.4.3集合函数研究两个数组中的数据是否存在某种集合关系时,可使用np的集合函数。x=np.arange(5) #array([0,1,2,3,4])y=np.arange(3,8) #array([3,4,5,6,7])np.intersect1d(x,y) #交集,注:不能用python的集合运算符号&|-Out:array([3,4]) #1d表示返回结果总是一维数组np.union1d(x,y) #并集Out:array([0,1,2,3,4,5,6,7])np.setdiff1d(x,y) #差集x-yOut:array([0,1,2])np.setxor1d(x,y) #对称差集,不同时存在于x和y集合中Out:array([0,1,2,5,6,7])应用:找出两个数据集a1和a2的交集

a1=np.random.randint(1,1e+8,1000000)a2=np.random.randint(1,1e+8,500000)ar=ersect1d(a1,a2)

7.4.4多项式np可构造多项式,可代入数值进行计算,还可求微分、积分、解方程。y=np.poly1d([1,-3,-4])#以列表形式给出多项式系数,y是构造的多项式Out:poly1d([1,-3,-4]) #对应y=x2-3x-4y([0.5,1,1.5])

#分别计算x取0.5,1,1.5时多项式的值Out:array([-5.25,-6.,-6.25])np.roots(y) #计算方程的根Out:array([4.,-1.]) #根为4.0和-1.0p=np.poly1d([2,4,0,3]) #构造多项式p=2x3+4x2+3

z=p+y

#p,y两个多项式相加Out:poly1d([2,5,-3,-1]) #z=2x3+5x2-3x-1z.deriv() #微分Out:poly1d([6,10,-3]) #等同于z'=6x2+10x-3eg() #积分poly1d([0.5,1.66666667,-1.5,-1.,0.])7.4.4多项式多项式拟合:利用给定的自变量和因变量,按指定的最高次方拟合多项式。统计学中称为回归。x=np.arange(1,21) #自变量y1=3*x+2+np.random.rand(20) #构造因变量y1,加入随机干扰值coef=np.polyfit(x,y1,1) #按一次多项式拟合,拟合系数如下Out:array([2.99028312,2.5900484])#y=2.99x+2.59ypre=np.poly1d(coef) #利用系数产生拟合多项式,建模yre(x) #将x带入模型ypre计算,得到预测值y2=x**2+3*x+1+np.random.rand(20) #构造测试数据y2np.polyfit(x,y2,2) #按二次多项式拟合,拟合系数如下Out:array([1.00000149,3.01755285,1.32390592])#y=x2+3.02x+1.327.4.5线性代数函数numpy的线性代数函数位于np.linalg子包中。fromnumpy.linalgimportinv,eig,det,matrix_rankA=np.array([[2,5,3],[1,2,3],[3,5,7]])b=inv(A) #inv求逆矩阵np.dot(A,b).round(2) #矩阵乘法且保留2位小数,写为A@b亦可det(A) #det计算行列式,结果为6matrix_rank(A) #矩阵的秩,结果为3eigvalue,eigvector=eig(A)#返回特征值eigvalue,特征向量eigvectoreigvalue.round(2)Out:array([10.76+0.j,0.12+0.67j,0.12-0.67j])eigvector.round(2) #每列即某特征值对应的特征向量Out:array([[0.47+0.j,0.9+0.j,0.9-0.j],[0.33+0.j,-0.2+0.24j,-0.2-0.24j],[0.82+0.j,-0.23-0.19j,-0.23+0.19j]])np.allclose(A@eigvector,eigvalue*eigvector)#检验上述计算结果7.5数组组合和文件存取7.5.1改变数组维度np提供多种方法调整数组维度,最常使用reshape方法。b=np.arange(6)c=b.reshape(1,6)#b形状不变,得到c,reshape()得到的是视图d=c.reshape(-1,2)#-1表示此轴长度由np自动计算得到,6/2=3也可设置shape属性或使用resize()方法b.shape=(2,3) #直接改变b的形状b.resize((2,3)) #效果同上b.transpose()#矩阵转置,也可写为b.T7.5数组组合和文件存取7.5.1改变数组维度要增加一个维度也可使用np.newaxis关键字ar=np.array([3,4,5])#原本是一维(3,)#变为二维(1,3),机器学习中需要将一维数据变为多维数据ar2=ar[np.newaxis,:]ar3=ar2[np.newaxis,:,:]#三维多维数组也可使用ravel或flatten函数展平为一维数组b=np.arange(6).reshape(2,3)d1=b.ravel() #将b转为一维数组,ravel得到的d1是视图d2=b.flatten() #将b转为一维数组,是复制,不是视图7.5数组组合和文件存取数组元素的插入、删除b=np.array([1,3,5,7])#array([1,3,5,7])c=np.append(b,[9,10])#末尾插入,b不变,返回新数组cOut:array([1,3,5,7,9,10])np.insert(b,2,20)#在第2个位置插入20,b不变,返回新数组Out:array([1,3,20,5,7])np.delete(b,[0,1])#删除第0/1处两个数据,b不变,返回删除后新数组Out:array([5,7])7.5.2数组组合1.水平组合(这些操作是复制)出于数据处理的需要,需要组合数组。NumPy数组有水平组合、垂直组合和深度组合等多种方式。a=np.arange(6).reshape(2,3)b=np.arange(10,16).reshape(2,3)np.hstack((a,b)) #水平组合。行数不变,列数增加np.concatenate((a,b),axis=1)#效果同上np.column_stack((a,b)) #效果同上或np.c_[(a,b)]7.5.2数组组合2.垂直组合np.vstack((a,b)) #垂直组合。行数增加,列数不变np.concatenate((a,b),axis=0)#效果同上np.row_stack((a,b)) #效果同上或np.r_[(a,b)]3.深度组合c=np.dstack((a,b))#深度组合。a,b是二维,c是三维7.5.3数组分割1.水平分割hsplit

(分割得到的数组是原数组的视图)b=np.arange(24).reshape(4,6) #生成4x6数组x1,x2=np.hsplit(b,2) #沿水平方向分为2个相同大小的4x3数组x1,x2,x3=np.hsplit(b,3) #沿水平方向分为3个相同大小的4x2数组#x4含原数组第0列,x5含第1、2、3列,x6含第4、5列x4,x5,x6=np.hsplit(b,[1,4]) #在第1,4列分隔

7.5.3数组分割2.垂直分割vsplitb=np.arange(24).reshape(4,6) #4x6数组y1,y2=np.vsplit(b,2) #沿垂直方向分为2个相同大小的2x6数组np.vsplit(b,4) #沿垂直方向分为4个相同大小的1x6数组3.深度分割dsplitb=np.arange(24).reshape(2,3,4) #2x3x4数组v1,v2=np.dsplit(b,2) #沿深度分为2个相同大小的2x3x2数组v1.shape,v2.shapeOut:((2,3,2),(2,3,2))注:dsplit()只能用于维度>=3的数组,不能用于一、二维数组

7.5.4读写文件1.读写文本文件NumPy可以读写文本和二进制数据文件。b=np.arange(95,101).reshape(2,3)np.savetxt('data.txt',b)#将数组b保存到data.txt文件中,保存时默认按科学计数法格式#指定以逗号','分隔,%i整数格式保存np.savetxt('data2.txt',b,delimiter=',',fmt='%i')!typedata2.txt#显示data2.txt文件内容95,96,9798,99,100c=np.loadtxt('data2.txt',delimiter=',')#读文本数据文件7.5.4读写文件2.读写.npy二进制格式文件np.save('tmp/data.npy',b)#将数组b保存为data.npy二进制文件d=np.load('tmp/data.npy') #读取npy格式的二进制文件b==d #验证b和d是相等的注:data.npy不能被第6章介绍的pickle读取,因为二进制文件格式不同。numpy小结/prpl/p/5537417.html7.5.5meshgrid网格数组假定有模型z=x2+xy+y2,现在x可取值[1,2,3],y可取值[5,6],x和y两两配对有6种组合,这些组合可用np.meshgrid命令生成为网格数组,将数组代入公式计算即可得到z值x1=np.array([1,2,3])y1=np.array([5,6])x,y=np.meshgrid(x1,y1)#meshgrid生成网格数组,返回的x和y是二维数组z=x**2+x*y+y**2meshgrid命令常见于3D绘图中,用于产生二维平面网格坐标。在机器学习中绘制分类区域时也常使用该命令生成坐标数组7.6应用实例【例1】用NumPy随机函数辅助推算圆周率pi思路:假定半径r=1的圆内置于边长a=2的正方形中。现用随机函数模拟产生均匀分布在(-1,1)坐标内的n个点,点可能落在圆内或圆外(正方形的边角处)。(1)点落在圆内的概率p=圆内的点数/总点数,点到圆心(0,0)的距离小于等于r即表示落在圆内。用随机函数做实验可模拟推算出p值。(2)又根据几何概率可知,点落在圆内的概率p=圆面积/正方形面积=pi*r2/(a*a),因此pi=p*a*a/r2。(绘制示意图的代码见本页备注)7.6应用实例importnumpyasnpr=1a=2fornin[1000,100000,10000000]:#测试3次不同的点数

ar=np.random.uniform(-r,r,size=(n,2))#落在圆内的点数k,(ar**2).sum(axis=1)**0.5计算每个点到圆心的距离

k=((ar**2).sum(axis=1)**0.5<=r).sum()p=k/n#随机实验中点落在圆内的概率

pi=p*a*a/r**2print(f'{n:<8}个点,pi={pi}')7.6应用实例【例2】points20.txt文件中存有20个点的x和y坐标,假设前10个点是红色,后10个点是蓝色。请找出与p(2,3)点距离最近的5个点,判断p点所属的颜色。即这5个点中哪种颜色最多,p点就归属哪种颜色importnumpyasnppoints=np.loadtxt('data/points20.txt',delimiter=',')

#20个点colors=np.array(list('r'*10+'b'*10))

#对应颜色p=np.array([2,3])distance=((points-p)**2).sum(axis=1)**0.5

#p点与其它点的距离arg=np.argsort(distance)

#按距离从小到大排序,返回点的序号k=5arcolor=colors[arg[:k]]

#取出距离最近的5个点的颜色fromcollectionsimportCounter#利用Counter统计频次print(Counter(arcolor).most_common(1)[0][0])#输出’b’,p点应为蓝色7.6应用实例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论