Python程序设计基础教程(微课版第2版)-第15章 常用的标准库和第三方库_第1页
Python程序设计基础教程(微课版第2版)-第15章 常用的标准库和第三方库_第2页
Python程序设计基础教程(微课版第2版)-第15章 常用的标准库和第三方库_第3页
Python程序设计基础教程(微课版第2版)-第15章 常用的标准库和第三方库_第4页
Python程序设计基础教程(微课版第2版)-第15章 常用的标准库和第三方库_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

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

文档简介

厦门大学计算机科学与技术系2026年第15章常用的标准库和第三方库《Python程序设计基础教程(微课版,第2版)》/post/python2教材【书名】Python程序设计基础教程(第2版

微课版)【作者】林子雨,赵江声,陶继平【书号】978-7-115-68934-4【定价】59.80元【出版日期】2026年3月官网:/post/python2本教材入选教育部“十四五”普通高等教育本科国家级规划教材提纲15.1turtle库15.2random库15.3time库15.4PyInstaller库15.5jieba库15.6wordcloud库15.7Matplotlib库15.8NumPy库15.9Pillow库15.1turtle库turtle库是Python语言中一个很流行的绘制图像的函数库。引用turtle库的方式有如下三种:(1)方式1:使用importturtle,函数调用时使用的语句格式是turtle.circle(10);(2)方式2:使用fromturtleimport*,函数调用时使用的语句格式是circle(10);(3)方式3:使用importturtleast,函数调用时使用的语句格式是t.circle(10)。15.1turtle库15.1.1turtle的常用函数15.1.2绘图实例15.1.1turtle的常用函数1.设置画布设置画布的函数如下:turtle.screensize(canvwidth=None,canvheight=None,bg=None)这个函数中的参数分别为画布的宽(单位是像素)、高、背景颜色,比如:turtle.screensize(800,600,"green")或者也可以使用如下函数:turtle.setup(width=0.5,height=0.75,startx=None,starty=None)在这个函数中,width、height表示宽和高,如果输入的值为整数,则表示像素,如果输入的值为小数,则表示占据电脑屏幕的比例。(startx,starty)这一坐标表示矩形窗口左上角顶点的位置,如果为空,则窗口位于屏幕中心。下面是两个实例:turtle.setup(width=0.6,height=0.6)turtle.setup(width=800,height=800,startx=100,starty=100)15.1.1turtle的常用函数2.设置画笔可以设置画笔颜色、画线的宽度、画笔的移动速度,具体如下:(1)turtle.pensize():设置画笔的宽度;(2)turtle.pencolor():如果没有参数传入,则返回当前画笔颜色,如果有传入参数,则设置画笔颜色,传入参数可以是字符串,比如“green”、“red”,也可以是RGB三元组。(3)turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围是[0,10]的整数,数字越大速度越快。15.1.1turtle的常用函数3.绘图函数表15-1、表15-2和表15-3分别给出了常用的画笔运动函数、画笔控制函数和其他函数。表15-1画笔运动函数函数说明turtle.forward(distance)向当前画笔方向移动distance像素长度turtle.backward(distance)向当前画笔相反方向移动distance像素长度turtle.right(degree)顺时针移动degree°turtle.left(degree)逆时针移动degree°turtle.pendown()移动时绘制图形turtle.goto(x,y)将画笔移动到坐标为x,y的位置turtle.penup()提起笔移动,不绘制图形,用于另起一个地方绘制turtle.circle()画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆turtle.setheading()设置画笔当前行进方向的角度(角度坐标体系中的绝对角度)15.1.1turtle的常用函数表15-2画笔控制函数函数说明turtle.fillcolor(colorstring)绘制图形的填充颜色urtle.color(color1,color2)同时设置pencolor=color1,fillcolor=color2turtle.filling()返回当前是否在填充状态turtle.begin_fill()准备开始填充图形turtle.end_fill()填充完成turtle.hideturtle()隐藏画笔的turtle形状turtle.showturtle()显示画笔的turtle形状表15-3其他函数函数说明turtle.mainloop()或turtle.done()启动事件循环,调用Tkinter的mainloop函数turtle.delay(delay=None)设置或返回以毫秒为单位的绘图延迟15.1.2绘图实例1.绘制五角星下面的代码用于绘制一个五角星,绘制效果图如15-1所示。01#five-pointed-star.py02fromturtleimportTurtle03p=Turtle()04p.speed(3)05p.pensize(5)06p.color("black","red")07p.begin_fill()08foriinrange(5):09p.forward(200)#将箭头移到某一指定坐标10p.right(144)#当前方向上向右转动角度11p.end_fill()图15-1绘制五角星15.1.2绘图实例2.绘制一条蛇下面的代码用于绘制一条蛇,绘制效果图如15-2所示。01#snake.py02importturtle03turtle.setup(650,350,200,200)04turtle.penup()05turtle.forward(-250)06turtle.pendown()07turtle.pensize(25)08turtle.pencolor("purple")09turtle.setheading(-40)10foriinrange(4):11turtle.circle(40,80)12turtle.circle(-40,80)13turtle.circle(40,80/2)14turtle.forward(40)15turtle.circle(16,180)16turtle.forward(40*2/3)17turtle.done()图15-2绘制一条蛇15.1.2绘图实例3.绘制太阳花下面的代码用于绘制一朵太阳花,绘制效果图如15-3所示。01#sun-flower.py02importturtle03importtime04turtle.color("red","yellow")05turtle.begin_fill()06foriinrange(50):07turtle.forward(200)08turtle.left(170)09turtle.end_fill()10turtle.mainloop()图15-3绘制太阳花15.2random库15.2.1基本随机数函数15.2.2扩展随机数函数15.2.1基本随机数函数Python是通过使用随机数种子来产生随机数的,只要种子相同,产生的随机序列,无论是每一个数,还是数与数之间的关系都是确定的,所以随机数种子决定了随机序列的产生。seed()函数就是用来初始化给定的随机数种子,默认为当前系统时间。具体实例如下:>>>importrandom>>>random.seed(8)#随机数种子取值为8>>>random.random()0.2267058593810488>>>random.random()0.9622950358343828>>>random.seed(8)#随机数种子取值为8>>>random.random()0.2267058593810488#生成的随机数可以重现15.2.1基本随机数函数>>>random.random()0.9622950358343828#生成的随机数可以重现>>>random.seed()#随机数种子取值为当前系统时间>>>random.random()0.9159875847083423>>>random.random()0.9737887393351271>>>random.seed()#随机数种子取值为当前系统时间>>>random.random()0.1830387102446276#生成的随机数不可以重现>>>random.random()#生成的随机数不可以重现0.7392871445268515从上面实例可以看出,当随机数种子一样时(比如,都取值为8),random()产生的随机数是可以重现的。但是,如果不使用随机数种子,seed()函数使用的是当前系统时间,后面产生的结果是完全不可重现的。15.2.2扩展随机数函数1.randint(a,b)生成一个[a,b]之间的整数,实例如下:>>>importrandom>>>random.randint(1,10)72.getrandbits(k)生成一个k比特长的随机整数,实例如下:>>>importrandom>>>random.getrandbits(8)793.uniform(a,b)生成一个[a,b]之间的随机小数,实例如下:>>>importrandom>>>random.uniform(1,10)8.92218271490217415.2.2扩展随机数函数4.randrange(m,n[,k])用户生成一个[m,n)之间以k为步长的随机整数,当省略k时,默认步长为1,实例如下:>>>importrandom>>>random.randrange(1,10)2>>>random.randrange(1,10)8>>>random.randrange(1,10)3>>>random.randrange(1,10,2)5>>>random.randrange(1,10,2)1>>>random.randrange(1,10,2)315.2.2扩展随机数函数5.choice(seq)从序列seq中随机选择一个元素,实例如下:>>>importrandom>>>random.choice([1,2,3,4,5,6,7,8,9])2>>>random.choice([1,2,3,4,5,6,7,8,9])3>>>random.choice([1,2,3,4,5,6,7,8,9])4>>>random.choice([1,2,3,4,5,6,7,8,9])615.2.2扩展随机数函数6.shuffle(seq)将序列seq中元素随机排列,返回打乱以后的序列,实例如下:>>>importrandom>>>s=[1,2,3,4,5,6,7,8,9]>>>random.shuffle(s)>>>print(s)[3,6,1,4,2,7,5,8,9]15.3time库15.3.1时间获取函数15.3.2时间格式化函数15.3.3程序计时函数15.3.1时间获取函数1.time()time()用于获取当前时间戳,即当前系统内表示时间的一个浮点数,实例如下:>>>importtime>>>time.time()1622081846.40550452.ctime()ctime()用于获取当前时间,并返回一个以人类可读方式表示的字符串,实例如下:>>>importtime>>>time.ctime()'ThuMay2710:19:182021'15.3.1时间获取函数3.gmtime()gmtime()用于获取当前时间,并返回计算机可处理的时间格式,实例如下:>>>importtime>>>time.gmtime()time.struct_time(tm_year=2021,tm_mon=5,tm_mday=27,tm_hour=2,tm_min=20,tm_sec=30,tm_wday=3,tm_yday=147,tm_isdst=0)15.3.2时间格式化函数时间格式化是将时间以合适方式展示出来的方法,类似于字符串的格式化,展示模板由特定格式化控制符组成。strftime(tpl,ts)tpl是格式化模板字符串(关于格式化字符串的详细说明请见表15-4),用来定义输出效果,ts是系统内部时间类型变量15.3.2时间格式化函数格式化字符串日期/时间说明取值范围和实例%Y年份0000-9999例如:1800%m月份01-12例如:8%B月份名称January-December例如:July%b月份名称简写(三个字符)Jan-Dec例如:Apr%d日期01-31例如25%A星期Monday-Sunday例如:Tuesday%a星期缩写(三个字符)Mon-Sun例如:Wed%H小时(24小时)00~23,例如:15%h小时(12小时)01~12,例如:9%P上/下午AM,PM,例如:AM%M分钟00~59,例如:34%S秒00~59,例如:42表15-4时间格式化字符串说明15.3.2时间格式化函数实例如下:>>>importtime>>>t=time.gmtime()>>>time.strftime("%Y-%m-%d%H:%M:%S",t)'2021-05-2702:48:30'>>>time.strftime("%Y-%B-%d-%A-%H-%p-%S")'2021-May-27-Thursday-10-AM-02'>>>time.strftime("%A-%p")'Thursday-AM'>>>time.strftime("%M:%S")'49:14'15.3.2时间格式化函数2.strptime(str,tpl)str是字符串形式的时间值,tpl是格式化模板字符串,用来定义输入效果,实例如下:>>>importtime>>>timeStr='2021-05-2710:26:21'>>>time.strptime(timeStr,"%Y-%m-%d%H:%M:%S")time.struct_time(tm_year=2021,tm_mon=5,tm_mday=27,tm_hour=10,tm_min=26,tm_sec=21,tm_wday=3,tm_yday=147,tm_isdst=-1)15.3.3程序计时函数程序计时是指测量程序从开始到结束所经历的时间,主要包括测量时间和产生时间两部分。time库提供了一个非常精准的测量时间函数perf_counter(),该函数可以获取CPU以其频率运行的时钟,这个时间往往是以纳秒来计算的,所以这样获取的时间非常精准。Time库提供的产生时间函数sleep(),可以让程序休眠或产生一段时间。15.3.3程序计时函数1.perf_counter()perf_counter()会返回系统运行时间,由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差值才是有效的。实例如下:>>>importtime>>>start=time.perf_counter()>>>print(start)1497.733367483>>>end=time.perf_counter()>>>print(end)1522.141805637>>>end-start24.40843815400012315.3.3程序计时函数2.sleep(s)在sleep(s)中,s为休眠时间,单位是秒,可以是浮点数,实例如下:>>>importtime>>>defwait(): time.sleep(4.5) >>>wait()15.3.3程序计时函数3.应用实例这里使用程序计时函数perf_counter()和sleep(s)实现一个实时显示程序执行进度的效果,具体代码如下:01#program_process.py02importtime03scale=4004print('执行开始')05start=time.perf_counter()06foriinrange(scale+1):07a='*'*i08b='.'*(scale-i)09c=(i/scale)*10010dur=time.perf_counter()-start11print("\r{:^3.0f}%[{}->{}]{:.2f}".format(c,a,b,dur))12time.sleep(0.1)13print('\n'+'执行结束')15.3.3程序计时函数15.4PyInstaller库PyInstaller库用于将Python源代码文件转换成exe格式的可执行文件。在Windows系统中,打开一个cmd窗口,执行如下命令就可以在Python3环境中安装PyInstaller库:>pipinstallpyinstallerPyInstaller的常用参数如表15-5所示。参数作用-h查看帮助--clean清理打包过程临时文件-D默认值,生成dist文件夹-F只在dist文件夹中生成打包文件-i<图标文件名.ico>指定打包文件使用的图标文件15.4PyInstaller库PyInstaller的最简单的使用方法是:pyinstaller-F<文件名.py>假设已经有一个代码文件“C:\mycode\hello.py”,里面只有一行代码“print("HelloWorld")”,可以使用如下命令生成可执行文件:>cdC:\mycode>pyinstaller-Fhello.py执行完上述命令以后,在“C:\mycode”目录下会生成三个新的目录,分别是__pycache__、build和dist,进入dist目录,里面就包含了一个可执行文件hello.exe,双击该文件就可以执行。15.5jieba库15.5.1jieba库简介15.5.2jieba的安装和使用15.5.3应用实例15.5.1jieba库简介Jieba库是一款流行的Python第三方中文分词库。jieba分词采用的是基于统计的分词方法,首先给定大量已经分好词的文本,利用机器学习的方法学习分词规律,然后保存训练好的模型,从而实现对新的文本的分词。具体而言,包括如下步骤:(1)先加载自带的字典,生成trie树;(2)给定待分词的句子,使用正则表达式获取连续的中文字符和英文字符,切分成短语列表,对每个短语使用DAG(有向无环图)和动态规划,得到最大概率路径,对DAG中那些没有在字典中查到的字,组合成一个新的片段短语,使用HMM模型(隐马尔科夫模型)进行分词,也就是识别新词,即识别字典外的新词;(3)使用Python的yield语法生成一个词语生成器,逐词语返回。15.5.1jieba库简介jieba中文分词支持三种分词模式:(1)精确模式:试图将语句最精确地切分,不存在冗余数据,适合做文本分析;(2)全模式:将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据;(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。15.5.1jieba库简介表15-6给出了jieba库的常用函数及其说明。函数说明jieba.cut(s)精确模式,返回一个可迭代的数据类型jieba.cut(s,cut_all=True)全模式,输出s中的所有可能单词jieba.cut_for_search(s)搜索引擎模式jieba.lcut(s)精确模式,返回一个列表类型jieba.lcut(s,cut_all=True)全模式,返回一个列表类型jieba.lcut_for_search(s)搜索引擎模式,返回一个列表类型jieba.add_word(w)向分词词典中增加新词w15.5.2jieba的安装和使用在Windows系统中,打开一个cmd窗口,执行如下命令就可以在Python3环境中安装jieba库:>pipinstalljieba15.5.2jieba的安装和使用新建一个代码文件jieba_test.py,内容如下:01#-*-coding:utf-8-*-02#jieba_test.py03importjieba04#全模式05text="我来到厦门大学数据库实验室"06seg_list=jieba.cut(text,cut_all=True)07print(u"[全模式]:","/".join(seg_list))0809#精确模式10seg_list=jieba.cut(text,cut_all=False)11print(u"精确模式]:","/".join(seg_list))1213#默认是精确模式14seg_list=jieba.cut(text)15print(u"[默认模式]:","/".join(seg_list))1617#搜索引擎模式18seg_list=jieba.cut_for_search(text)19print(u"[搜索引擎模式]:","/".join(seg_list))15.5.2jieba的安装和使用代码的执行结果如下:[全模式]:我/来到/厦门/厦门大学/大学/数据/数据库/据库/实验/实验室精确模式]:我/来到/厦门大学/数据库/实验室[默认模式]:我/来到/厦门大学/数据库/实验室[搜索引擎模式]:我/来到/厦门/大学/厦门大学/数据/据库/数据库/实验/实验室15.5.3应用实例这里给出一个具体应用实例,完成的功能是,给定一段语句,使用jieba分词对语句进行分词,并统计出出现次数排在前3位的词语,具体实现代码如下:01#-*-coding:utf-8-*-02#wordcount.py03importjieba0405text="厦门大学设有研究生院、6个学部以及30个学院和16个研究院,形成了包括人文科学、社会科学、自然科学、工程与技术科学、管理科学、艺术科学、医学科学等学科门类在内的完备学科体系。学校现有18个学科进入ESI全球前1%,拥有5个一级学科国家重点学科、9个二级学科国家重点学科。学校设有32个博士后流动站;36个博士学位授权一级学科,45个硕士学位授权一级学科;8个交叉学科;1个博士专业学位学科授权类别,28个硕士专业学位学科授权类别。”15.5.3应用实例06words=jieba.cut(text)#使用精确模式对文本进行分词07counts={}#通过键值对的形式存储词语及其出现的次数0809forwordinwords:10iflen(word)==1:#不对单个字的词语进行统计11continue12else:13counts[word]=counts.get(word,0)+1#词语每出现一次,其对应的次数加11415items=list(counts.items())16items.sort(key=lambdax:x[1],reverse=True)#根据词语出现的次数进行从大到小排序1718foriinrange(3):19word,count=items[i]20print("{0:<4}{1:>4}".format(word,count))15.6wordcloud库wordcloud是优秀的词云展示第三方库,它可以根据文本中词语出现的频率等参数绘制词云,而且词云的绘制形状、尺寸和颜色都可以设定。Python安装好以后,默认是没有安装wordcloud库的,需要单独安装。在Windows系统中打开一个cmd窗口,执行如下命令安装wordcloud库:>pipinstallwordcloud15.6wordcloud库在使用wordcloud制作词云时,首先要声明一个WordCloud对象,语法如下:w=wordcloud.WordCloud(<参数>);对于一个WordCloud对象w,它可以使用的基本函数如下:w.generate():向WordCloud对象中加载文本;w.to_file(filename):将词云输出为图像文件(png或jpg格式)。对于一个WordCloud对象w,可以配置如表15-7所示的各种参数。15.6wordcloud库参数描述width指定词云对象生成图片的宽度,默认为400像素实例:w=wordcloud.WordCloud(width=500)height指定词云对象生成图片的高度,默认为200像素实例:w=wordcloud.WordCloud(height=300)min_font_size指定词云中字体的最小字号,默认为4号实例:w=wordcloud.WordCloud(min_font_size=10)max_font_size指定词云中字体的最大字号,根据高度自动调节实例:w=wordcloud.WordCloud(max_font_size=20)font_step指定词云中字体字号的步进间隔,默认为1实例:w=wordcloud.WordCloud(font_step=2)font_path指定文体文件的路径,默认为None实例:w=wordcloud.WordCloud(font_path="msyh.ttc")max_words指定词云显示的最大单词数量,默认为200实例:w=wordcloud.WordCloud(max_words=20)stop_words指定词云的排除词列表,即不显示的单词列表实例:w=wordcloud.WordCloud(stop_words="Python")mask指定词云形状,默认为长方形实例:importimageio#需要事先安装imageio库mk=imageio.imread("pic.png")w=wordcloud.WordCloud(mask=mk)background_color指定词云图片的背景颜色,默认为黑色实例:w=wordcloud.WordCloud(background_color="white")表15-7WordCloud对象的配置参数15.6wordcloud库绘制词云包含3个主要步骤:配置对象参数;加载词云文本;输出文本。15.6wordcloud库下面是制作词云的简单实例:01 #wordcloud_university.py02 importjieba03 importwordcloud04 txt="厦门大学设有研究生院、6个学部以及30个学院和16个研究院,形成了包括人文科学、社会科学、自然科学、工程与技术科学、管理科学、艺术科学、医学科学等学科门类在内的完备学科体系。学校现有18个学科进入ESI全球前1%,拥有5个一级学科国家重点学科、9个二级学科国家重点学科。学校设有32个博士后流动站;36个博士学位授权一级学科,45个硕士学位授权一级学科;8个交叉学科;1个博士专业学位学科授权类别,28个硕士专业学位学科授权类别。"05 w=wordcloud.WordCloud(width=1000,font_path="C:\\Windows\\Fonts\\simsun.ttc",height=700)06 w.generate("".join(jieba.lcut(txt)))07 w.to_file("university.png")15.6wordcloud库程序执行成功后会生成一个名称为“university.png”的词云图片(如图15-5所示)。图15-5一个词云的简单实例15.7Matplotlib库Matplotlib是Python最著名的绘图库,它提供了一整套和Matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入到GUI应用程序中。Matplotlib能够创建多种类型的图表,如条形图、散点图、饼图、堆叠图、3D图和地图图表。Python安装好以后,默认是没有安装Matplotlib库的,需要单独安装。在Windows系统中打开一个cmd窗口,执行如下命令安装Matplotlib库:>pipinstallmatplotlib15.7Matplotlib库15.7.1绘制折线图15.7.2绘制条形图15.7.3绘制直方图15.7.4绘制饼图15.7.1绘制折线图首先要导入pyplot模块:>>>importmatplotlib.pyplotasplt接下来,调用plot方法绘制一些坐标:>>>plt.plot([1,2,3],[4,8,5])plot()方法需要很多参数,但是最主要的是前2个参数,分别表示x坐标和y坐标,比如,上面语句中放入了两个列表[1,2,3]和[4,8,5],就表示生成了3个坐标(1,4)、(2,8)和(3,5)。下面可以把图表显示到屏幕上(如图15-6所示):>>>plt.show()图15-6三个坐标点生成的折线图15.7.1绘制折线图下面画出两条折线,并且给每条折线一个名称:>>>x=[1,2,3]#第1条折线的横坐标>>>y=[4,8,5]#第1条折线的纵坐标>>>x2=[1,2,3]#第2条折线的横坐标>>>y2=[11,15,13]#第2条折线的纵坐标>>>plt.plot(x,y,label='FirstLine')#绘制第1条折线,给折线一个名称'FirstLine'>>>plt.plot(x2,y2,label='SecondLine')#绘制第2条折线,给折线一个名称'SecondLine'>>>plt.xlabel('PlotNumber')#给横坐标轴添加名称>>>plt.ylabel('Importantvar')#给纵坐标轴添加名称>>>plt.title('GraphExample\nTwolines')#添加标题>>>plt.legend()#添加图例>>>plt.show()#显示到屏幕上(如图15-7所示)15.7.1绘制折线图图15-7绘制两条折线15.7.2绘制条形图下面介绍条形图的绘制方法。>>>plt.bar([1,3,5,7,9],[6,3,8,9,2],label="FirstBar")#第1个数据系列>>>#下面的color='g',表示设置颜色为绿色>>>plt.bar([2,4,6,8,10],[9,7,3,6,7],label="SecondBar",color='g')#第2个数据系列>>>plt.legend()#添加图例>>>plt.xlabel('barnumber')#给横坐标轴添加名称>>>plt.ylabel('barheight')#给纵坐标轴添加名称>>>plt.title('BarExample\nTwobars!')#添加标题>>>plt.show()#显示到屏幕上(如图15-8所示)15.7.2绘制条形图图15-8条形图15.7.3绘制直方图下面介绍直方图的绘制方法。>>>population_ages=[21,57,61,47,25,21,33,41,41,5,96,103,108, 121,122,123,131,112,114,113,82,77,67,56,46,44,45,47]>>>bins=[0,10,20,30,40,50,60,70,80,90,100,110,120,130]>>>plt.hist(population_ages,bins,histtype='bar',rwidth=0.8)>>>plt.xlabel('x')>>>plt.ylabel('y')>>>plt.title('GraphExample\nHistogram')>>>plt.show()#显示到屏幕上(如图15-9所示)15.7.3绘制直方图图15-9直方图15.7.4绘制饼图下面介绍饼图的绘制方法。>>>slices=[7,2,2,13]#即activities分别占比7/24,2/24,2/24,13/24>>>activities=['sleeping','eating','working','playing']>>>cols=['c','m','r','b']>>>plt.pie(slices,labels=activities,colors=cols,startangle=90,shadow=True,explode=(0,0.1,0,0),autopct='%1.1f%%')>>>plt.title('GraphExample\nPiechart')>>>plt.show()#显示到屏幕上(如图15-10所示)15.7.4绘制饼图图15-10饼图15.8NumPy库15.8.1概述15.8.2数组创建15.8.3数组索引和切片15.8.4数组运算15.8.5数组对象的常用函数15.8.1概述NumPy数组是NumPy库中的核心对象,它是一个用于保存数据的网格状结构。这种数组可以拥有任意数量的维度,每个维度也可以是任意长度,因此可以非常方便地处理各种类型的数据集。15.8.1概述NumPy数组有许多重要的特性:(1)数据类型:NumPy数组具有明确的数据类型,这可以提高处理速度并减少内存使用。在创建数组时,可以指定数据类型,如整数、浮点数或复数等。默认情况下,如果未指定数据类型,NumPy会根据输入数据自动推断数据类型。(2)形状:数组的形状由其维度确定。一维数组类似于Python列表,而多维数组则类似于嵌套列表。可以通过数组的shape属性获取其维度信息。(3)广播机制:NumPy的广播机制允许对不同形状的数组进行数学运算,而无需显式地重塑或复制数据,这使得在数组上进行计算变得非常高效。15.8.1概述(4)切片和索引:NumPy数组支持类似于Python列表的切片和索引操作,这使得访问和修改数组元素变得非常直观和方便。(5)数学运算:NumPy提供了大量的数学函数和操作符,可以直接对数组进行运算,无需编写循环,这使得处理大规模数据集时能够显著提高性能。15.8.2数组创建下面是数组创建的一些具体实例:>>>importnumpyasnp>>>a=[1,2,3,4,5]#创建简单的列表>>>b=np.array(a)#将列表转换为数组>>>barray([1,2,3,4,5])>>>b.size#数组的元素个数5>>>b.shape#数组的形状(5,)>>>b.ndim#数组的维度1>>>b.dtype#数据的元素类型dtype('int32')>>>print(b[0],b[1],b[2])#访问数组元素12315.8.2数组创建>>>b[4]=6#修改数组元素>>>barray([1,2,3,4,6])>>>c=np.array([[1,2,3],[4,5,6]])#创建二维数组>>>c.shape#数组的形状(2,3)>>>print(c[0,0],c[0,1],c[0,2],c[1,0],c[1,1],c[1,2])123456>>>d=a.copy()#数组的复制>>>d[1,2,3,4,5]15.8.2数组创建NumPy还提供了一些常用的数据创建函数,包括zeros()、ones()、empty()、eye()、full()、random.random()、random.randint()、random.rand()、random.randn()、random.uniform()、linspace()、arange()等。(1)zeros():创建一个数组,内部元素均为0,第一个参数提供维度,第二个参数提供类型。>>>a=np.zeros([2,3],int)>>>aarray([[0,0,0],[0,0,0]])15.8.2数组创建(2)ones():创建一个数组,内部元素均为1,第一个参数提供维度,第二个参数提供类型。>>>a=np.ones([2,3],int)>>>aarray([[1,1,1],[1,1,1]])15.8.2数组创建(3)empty():创建一个没有任何具体值的数组,第一个参数提供维度,第二个参数提供类型。>>>a=np.empty([2,3],int)>>>aarray([[0,0,0],[0,0,0]])15.8.2数组创建(4)eye():返回一个具有对角线为1其余元素为0的二维数组,常称为单位矩阵;第一个参数提供矩阵规模;第二个参数如果为0则对角线全为“1”,大于0则右上方第k条对角线全为“1”,小于0则左下方第k条对角线全为“1”;第三个参数提供类型。>>>a=np.eye(3,k=1,dtype=int)>>>aarray([[0,1,0],[0,0,1],[0,0,0]])>>>a=np.eye(4,k=-2,dtype=int)>>>aarray([[0,0,0,0],[0,0,0,0],[1,0,0,0],[0,1,0,0]])15.8.2数组创建(5)full():full((m,n),c)用于创建一个指定形状(m行n列)、指定值(c)的数组。>>>a=np.full((2,3),4)>>>aarray([[4,4,4],[4,4,4]])15.8.2数组创建(6)random.random():random.random((m,n))生成一个m行n列的元素为0~1随机数的数组。>>>a=np.random.random((2,3))>>>aarray([[0.46657535,0.2398773,0.18675721],[0.30525201,0.66826887,0.5708038]])15.8.2数组创建(7)random.randint():random.randint(low,high=None,size=None,dtype='l')返回一个随机整数,范围从低(包括)到高(不包括),即[low,high)。如果没有写参数high的值,则返回[0,low)的值。size用于指定生成元素值的形状,也就是数组维度的大小,如果不指定size这个参数,那么生成的元素值的个数只有一个。>>>a=np.random.randint(2,size=10)>>>aarray([0,1,0,0,1,1,0,0,1,1])>>>b=np.random.randint(5,size=(2,4))>>>barray([[1,2,3,3],[0,0,2,4]])15.8.2数组创建(8)random.rand():random.rand(d0,d1,…,dn)根据给定维度生成[0,1)内的数据,其中,dn表示数组每个维度的元素个数。>>>a=np.random.rand(4,2)>>>aarray([[0.22225254,0.25555882],[0.69250455,0.62957494],[0.567664,0.30459249],[0.16394031,0.00900947]])15.8.2数组创建(9)random.randn():random.randn(d0,d1,…,dn)返回一个或一组样本,具有标准正态分布,其中,dn表示数组每个维度的元素个数。>>>a=np.random.randn(2,4)>>>aarray([[-0.28183753,-0.4931384,-2.11355842,0.17782074],[-1.14089585,0.816798,0.39287532,-0.19339946]])(10)random.uniform():random.uniform(low,high,size)会从一个均匀分布[low,high)中随机采样,其中,low表示采样下界,float类型,默认值为0;high表示采样上界,float类型,默认值为1;size表示输出样本数目,为int或元组类型,例如,size=(m,n,k),则输出m*n*k个样本,缺省时输出1个值。>>>a=np.random.uniform(5,10,size=4)>>>aarray([6.67581928,9.15495131,5.02607146,5.05260788])15.8.2数组创建(11)linspace():linspace(start,end,num=num_points,endpoint=False,retstep=True,axis=0,dtype=int),用于在线性区域中生成等间距的序列。其中,[start,end]表示数值区间;num表示元素个数;endpoint如果设置为False,表示对应的序列在[start,end),即不包括最后一个元素;retstep如果设置为True,则返回的序列结果为一个元组;axis用于设置轴来存储,默认为0,表示在开始处插入新轴;dtype表示数据类型,默认类型为int,很多时候输出为float类型。15.8.2数组创建>>>a=np.linspace(10,100,10)>>>aarray([10.,20.,30.,40.,50.,60.,70.,80.,90.,100.])(12)arange():arange(start,stop,step,dtype=None)返回在给定的间隔内返回具有一定步长的整数。start和stop分别表示开始位置和结束位置,step表示步长,dtype表示输出数组的类型,如果未给出dtype,则从其他输入参数推断数据类型。>>>a=np.arange(1,5,2)>>>aarray([1,3])>>>a=np.arange(1,5)#起点为1,步长默认为1>>>aarray([1,2,3,4])>>>a=np.arange(5)#只有结束项>>>aarray([0,1,2,3,4])15.8.3数组索引和切片与Python列表类似,NumPy数组可以索引和切片。由于数组可能是多维的,因此,必须为数组的每个维度指定一个索引或切片。具体实例如下:>>>a=np.arange(10)#返回0~9,整型>>>aarray([0,1,2,3,4,5,6,7,8,9])>>>a[5]5>>>a[5:8]array([5,6,7])>>>a[5:8]=12>>>aarray([0,1,2,3,4,12,12,12,8,9])15.8.3数组索引和切片>>>a=np.arange(10)>>>a_slice=a[5:8]>>>a_slice[0]=-1>>>a_slicearray([-1,6,7])>>>aarray([0,1,2,3,4,-1,6,7,8,9])>>>b=np.array([[1,2,3],[4,5,6],[7,8,9]])>>>b[2]array([7,8,9])>>>b[0][2]3>>>b[0,2]315.8.3数组索引和切片>>>b[:2]array([[1,2,3],[4,5,6]])>>>b[:2,1:]array([[2,3],[5,6]])>>>b[1,:2]array([4,5])>>>b[:2,2]array([3,6])>>>b[:,:1]array([[1],[4],[7]])15.8.4数组运算数组运算实质上是数组对应位置的元素的运算,常见的是加、减、乘、除、开方等运算。具体实例如下:>>>a=np.array([[1,2,3],[4,5,6]])>>>a*aarray([[1,4,9],[16,25,36]])>>>a-aarray([[0,0,0],[0,0,0]])>>>1/aarray([[1.,0.5,0.33333333],[0.25,0.2,0.16666667]])15.8.4数组运算>>>a+aarray([[2,4,6],[8,10,12]])>>>np.exp(a)#e的幂array([[2.71828183,7.3890561,20.08553692],[54.59815003,148.4131591,403.42879349]])>>>np.sqrt(a)array([[1.,1.41421356,1.73205081],[2.,2.23606798,2.44948974]])>>>a**2array([[1,4,9],[16,25,36]],dtype=int32)15.8.5数组对象的常用函数NumPy提供了函数或方法对数组进行基本操作,掌握了这些基本操作,可以在使用数组的时候更加灵活多变,也可以为后续的编程提供更简便的算法。数组对象常用的函数包括以下几类:(1)修改数组形状:reshape()、flatten()、ravel();(2)翻转数组:transpose()、rollaxis()、swapaxes();(3)修改数组维度:expand_dims()、squeeze();(4)连接数组:concatenate()、union1d()、stack、hstack()、vstack();(5)拆分数组:split()、hsplit()、vsplit();(6)数组元素的添加、删除与替换:resize()、append()、insert()、delete()、unique()、where()、put();(7)数学计算:min()、max()、mean()、median()、sum()、abs();(8)排序:sort()、argsort()。15.9Pillow库15.9.1Pillow概述15.9.2Pillow库Image类15.9.3Pillow库ImageFilter类和ImageEnhance类15.9.4Pillow库ImageDraw类和ImageFont类15.9.5图像的字符画绘制15.9.1Pillow概述Pillow库的主要特点和功能如下:(1)图像格式支持:Pillow支持大量的图像文件格式,包括但不限于JPEG、PNG、BMP、GIF、TIFF、SVG等。开发者可以轻松地读取、编辑和保存这些格式的图像。(2)图像处理功能:Pillow提供了丰富的图像处理功能,如图像缩放、裁剪、旋转、翻转、色彩调整(如亮度、对比度、饱和度、色相调整等)、滤镜效果(如模糊、锐化、边缘检测等)、图像合成(如透明度调整、图层叠加等)。(3)像素级操作:Pillow允许开发者直接访问和操作图像的像素数据。你可以读取像素值,对它们进行修改,然后再将修改后的数据写回到图像中。(4)图像显示:Pillow支持将图像显示在屏幕上,通常配合Tkinter或其他GUI库使用。15.9.1Pillow概述(5)文字绘制:Pillow支持在图像上绘制文字,可以设置文字内容、字体、大小、颜色等属性。(6)图像分析:Pillow提供了一些基本的图像分析功能,如计算图像的直方图、获取图像的统计信息等。(7)图像转换:Pillow可以将图像转换为不同的颜色模式(如RGB、CMYK、灰度等),以适应不同的输出需求。(8)性能优化:虽然Pillow是用纯Python编写的,但它内部使用了许多优化的算法和C语言扩展,以提供较好的性能。对于大规模的图像处理任务,开发者可以通过调整Pillow的配置或结合其他工具(如NumPy)来进一步提高性能。15.9.1Pillow概述丰富功能的实现,得益于Pillow提供了众多的模块。在Pillow库中有二十多个模块,比如Image图像处理模块、ImageFont添加文本模块、ImageColor颜色处理模块、ImageDraw绘图模块等等,每个模块各自实现了不同的功能,同时模块之间又可以互相配合。通过Python包管理器pip来安装Pillow是最简单、轻量级的一种安装方式,并且这种方法适用于任何平台,只需执行以下命令即可:>pipinstallpillow15.9.2Pillow库Image类1.创建Image对象Image类是Pillow库中最为重要的类,该类被定义在和与其同名的Image模块中。需要使用下列导包方式引入Image模块:>>>fromPILimportImage使用Image类可以实例化一个Image对象,通过调用该对象的一系列属性和方法对图像进行处理。Pillow提供了两种创建Image实例对象的方法:open()和new(),这里介绍open()的使用方法。使用Image类的open()方法,可以创建一个Image对象,语法格式如下:im=Image.open(fp,mode="r")其中,fp表示文件路径,采用字符串格式;mode是可选参数,若出现该参数,则必须设置为

"r",否则会引发ValueError异常。15.9.2Pillow库Image类下面是具体实例:>>>fromPILimportImage>>>#打开一个位于Python当前工作目录下的图片文件xiamen-university.jpg>>>#需要提前准备好图片xiamen-university.jpg>>>im=Image.open("xiamen-university.jpg")>>>#调用show()方法显示图像>>>im.show()15.9.2Pillow库Image类2.Image对象的基本属性Image对象有一些常用的基本属性,这些属性能够帮助我们了解图片的基本信息,下面对这些属性用法做简单的演示:>>>fromPILimportImage>>>im=Image.open("xiamen-university.jpg")>>>print("宽是%s高是%s"%(im.width,im.height))>>>print("图像的大小size:",im.size)>>>print("图像的格式:",im.format)>>>print("图像是否为只读:",im.readonly)>>>print("图像信息:",)>>>print("图像模式信息:",im.mode)15.9.2Pillow库Image类3.Pillow图片格式转换Pillow能够很轻松地实现图片格式之间的转换。图片格式之间的转换主要有两种方法:save()和convert()。save()方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。save()的语法格式如下:Image.save(fp,format=None)其中,fp是图片的存储路径,包含图片的名称,采用字符串格式;format是可选参数,用于指定图片的格式。>>>fromPILimportImage>>>im=Image.open("xiamen-university.jpg")>>>im.save('xiamen-university.bmp')15.9.2Pillow库Image类但是,并非所有的图片格式都可以用save()方法转换完成,比如,将PNG格式的图片保存为JPG格式,如果直接使用save()方法就会报错。引发错误的原因是由于PNG和JPG图像模式不一致导致的。其中,PNG是四通道RGBA模式,即红色、绿色、蓝色、Alpha透明色;JPG是三通道RGB模式。因此,要想实现图片格式的转换,就要将PNG转变为三通道RGB模式。Image类提供的convert()方法可以实现图像模式的转换。该函数提供了多个参数,比如mode、matrix、dither等,其中,最关键的参数是mode,其余参数无须关心。语法格式如下:convert(mode,params**)其中,mode指的是要转换成的图像模式;params是其他可选参数。>>>fromPILimportImage>>>#假设在Python当前工作目录下已经存在图片文件example.png>>>im=Image.open("example.png")>>>image=im.convert('RGB')>>>im.save('example.jpg')15.9.2Pillow库Image类4.Pillow图像缩放操作

在图像处理过程中,经常会遇到缩小或放大图像的情况,Image类提供的resize()方法能够实现任意缩小和放大图像。resize()函数的语法格式如下:resize(size,resample=image.BICUBIC,box=None,reducing_gap=None)各个参数的含义如下:(1)size:元组参数(width,height),图片缩放后的尺寸;(2)resample:可选参数,指图像重采样滤波器,默认为Image.BICUBIC;(3)box:对指定图片区域进行缩放,box的参数值是长度为4的像素坐标元组,即(左,上,右,下)。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放;(4)reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有3.0和5.0。15.9.2Pillow库Image类>>>fromPILimportImage>>>im=Image.open("example.png")>>>print("图像的大小size:",im.size)

>>>image=im.resize((135,54))

#缩小图片>>>image.save("example-small.png")>>>print("查看新图像的尺寸",image.size)15.9.2Pillow库Image类Image类还支持创建缩略图。缩略图指的是将原图缩小至一个指定大小的图像。通过创建缩略图可以使图像更易于展示和浏览。Image对象提供了一个thumbnail()方法用来生图像的缩略图,该函数的语法格式如下:thumbnail(size,resample)其中,size是元组参数,指的是缩小后的图像大小;resample是可选参数,指图像重采样滤波器,有四种过滤方式,分别是Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为Image.BICUBIC。>>>fromPILimportImage>>>im=Image.open("example.png")>>>im.thumbnail((100,50))>>>print("缩略图尺寸",im.size)>>>im.save("example-thumbnail.png")15.9.2Pillow库Image类在图像处理过程中,对于某些不需要精细处理的环节,我们往往采用批量处理方法,比如批量转换格式、批量修改尺寸等,这是一种提升工作效率的有

温馨提示

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

评论

0/150

提交评论