Python电子教案9-1-科学计算和可视化

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Python语言程序设计第10章科学计算和可视化计算不再关乎计算机,它与生活处处相关。Computingisnotaboutcomputersanymore.Itisaboutliving.——尼古拉斯·尼葛洛庞帝(NicholasNegroponte)麻省理工学院媒体实验室的创办人问题概述要点科学计算需要采用矩阵运算库numpy和绘制库matplotlib科学计算科学计算是解决科学和工程中的数学问题利用计算机进行的数值计算,它不仅是科学家在运算自然规律时所使用的计算工具,更是普通人提升专业化程度的必要手段。Python语言为开展人人都能使用的科学计算提供了有力支持。科学计算开展基本的科学计算需要两个步骤:组织数据和展示数据;组织数据是运算的基础,也是将客观世界数字化的必要手段;展示数据是体现运算结果的重要方式,也是展示结论的有力武器。矩阵数学的矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。矩阵是高等代数学中的常见工具,主要应用于统计数学、物理学、电路学、力学、光学、量子物理、计算机图像和动画等领域。科学计算科学计算领域最著名的计算平台Matlab采用矩阵作为最基础的变量类型。矩阵有维度概念,一维矩阵是线性的,类似于列表,二维矩阵是表格状的,这是常用的数据表示形式。科学计算与传统计算一个显著区别在于,科学计算以矩阵而不是单一数值为基础,增加了计算密度,能够表达更为复杂的数据运算逻辑。拓展:离散和连续矩阵是一个典型的离散变量类型,它将一些数据组织到一起。世界是连续的还是离散的呢?从人类观测角度,世界可以被解释成一个个离散的观测值;从微观角度,世界是原子不停运动的结果,应该是连续的;再微观到量子力学角度,任何连续运动都是最小粒子量子运动的结果,世界应该是离散的。宇宙真有最小粒子吗?——世界是不确定的,还是确定的?世界是概率的,还是微积分的?——醒醒,开始看程序!思考与练习:[E10.1]思考在日常工作和生活中科学计算还有什么应用?[E10.2]尝试安装numpy和matplotlib库。模块10numpy库的使用要点numpy是用于处理含有同种元素的多维数组运算的第三方库。numpy库概述Python标准库中提供了一个array类型,用于保存数组类型数据,然而这个类型不支持多维数据,处理函数也不够丰富,不适合用于做数值运算。因此,Python语言的第三方库numpy得到了迅速发展,至今,numpy已经成为了科学计算事实上的标准库。numpy库概述numpy库处理的最基础数据类型是由同种元素构成的多维数组(ndarray),简称“数组”。数组中所有元素的类型必须相同,数组中元素可以用整数索引,序号从0开始。ndarray类型的维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。一维数组的秩为1,二维数组的秩为2,二维数组相当于由两个一维数组构成。numpy库概述由于numpy库中函数较多且命名容易与常用命名混淆,建议采用如下方式引用numpy库:importnumpyasnp其中,as保留字与import一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在程序的后续部分中,np代替numpy。numpy库常用的创建数组函数ndarray类的常用属性创建一个简单的数组后,可以查看ndarray类型有一些基本属性ndarray类的常用属性ndarray类的形态操作方法ndarray类的形态操作方法数组在numpy中被当作对象,可以采用a.b()方式调用一些方法。这里给出了改变数组基础形态的操作方法,例如改变和调换数组维度等。其中,np.flatten()函数用于数组降维,相当于平铺数组中数据,该功能在矩阵运算及图像处理中用处很大。ndarray类的索引和切片方法ndarray类的索引和切片方法数组切片得到的是原始数组的视图,所有修改都会直接反映到源数组。如果需要得到的ndarray切片的一份副本,需要进行复制操作,比如arange[5:8].copy()ndarray类的索引和切片方法numpy库的算术运算函数numpy库的算术运算函数这些函数中,输出参数y可选,如果没有指定,将创建并返回一个新的数组保存计算结果;如果指定参数,则将结果保存到参数中。例如,两个数组相加可以简单地写为a+b,而np.add(a,b,a)则表示a+=b。numpy库的比较运算函数numpy库的比较运算函数其将返回一个布尔数组,它包含两个数组中对应元素值的比较结果,例子如下。where()函数是三元表达式xifconditionelsey的矢量版本。numpy库的其他运算函数numpy库numpy库还包括三角运算函数、傅里叶变换、随机和概率分布、基本数值统计、位运算、矩阵运算等非常丰富的功能,读者在使用时可以到官方网站查询。拓展:运算规则实数的算术运算是最为常见的运算规则,类似的,矩阵也有算术运算。一个完备的运算体系包括运算基本单位和运算规则。在numpy中,运算基本单位是数组,运算规则与实数一样,包括:算术运算、比较运算、统计运算、三角运算、随机运算等。numpy库的广泛使用与完备的运算体系密切相关。思考与练习:[E10.3]创建一个ndarray变量有哪些方法?[E10.4]如何对ndarray每个变量求平方根?[E10.5]思考ndarray的降维是什么含义?实例19图像的手绘效果要点这是一个使用numpy和PIL库提取图像特征形成手绘效果的实例。Python与手绘第7章使用PIL库获取了图像的轮廓,虽然提取了轮廓,但这个轮廓缺少立体感,视觉效果不够丰满Python与手绘光线照射使立体物出现明暗变化,运用这个原理是空间素描的基本方法,本节介绍采用Python程序增加深浅层次变化,从而使图像轮廓更富立体感、空间感和色泽感,接近人类手绘效果。图像的数组表示图像是有规则的二维数据,可以用numpy库将图像转换成数组对象图像的数组表示图像转换对应的ndarray类型是3维数据,如(881,1266,3),其中,前两维表示图像的长度和宽度,单位是像素,第三维表示每个像素点的RGB值,每个RGB值是一个单字节整数。像素处理PIL库包括图像转换函数,能够改变图像单个像素的表示形式。使用convert()函数,这是’L’模式,表示将像素表示从RGB的3字节形式转变为单一数值形式,这个数值范围在0到255,表示灰度色彩变化像素处理此时,图像从彩色变为带有灰度的黑白色。转换后,图像的ndarray类型变为二维数据,每个像素点色彩只由一个整数表示。像素处理通过对图像的数组转换,可以利用numpy访问图像上任意像素值,例如,获取访问位于坐标(20,300)像素的颜色值或获取图像中最大和最小的像素值。也可以采用切片方式获取指定行或列的元素值,甚至修改这些值。像素处理像素处理将图像读入ndarray数组对象后,可以通过任意数学操作来获取相应的图像变换。以灰度变换为例,分别对灰度变化后的图像进行反变换、区间变化和像素值平方处理。像素处理需要注意,有些数学变换会改变图像的数据类型,如变成整数型等,所以在重新生成PIL图像前要先将数据类型通过numpy.uint()变换成整数像素处理拓展:灰度值灰度值指黑白图像中点的颜色深度,范围从0到255,白色为255,黑色为0,因此,黑白图像也被称为灰度图像。黑白图像主要用于构建非可见光图像,例如医学中超声波形成的图像等。RGB彩色图片可以通过如下公式转换成灰度值:Gray=R*0.3+G*0.59+B*0.11严格说,黑白图像是计算机计算能力或存储能力不充分时形成图像的重要方式,如果单个像素点能获得数据值种类超过256且计算资源足够,采用彩色图像也可以构建非可见光图谱,例如医学应用中新发展的彩色超声波成像等。图像的手绘效果之前介绍了10种ImageFilter类型的滤镜方法。通常获得铅笔画风格图像采用ImageFilter.CONTOUR滤镜,它能够将图像的轮廓信息提取出来,原图像在视觉上更加的立体,获得的轮廓图像缺乏立体感。图像轮廓和手绘效果的对比图像的手绘效果为了实现手绘风格,即黑白轮廓描绘,首先需要读取原图像的明暗变化,即灰度值。从直观视觉感受上定义,图像灰度值显著变化的地方就是梯度,它描述了图像灰度变化的强度。图像的手绘效果通常可以使用梯度计算来提取图像轮廓,numpy中提供了直接获取灰度图像梯度的函数gradient(),传入图像数组表示即可返回代表x和y各自方向上梯度变化的二维元组图像的手绘效果图像的手绘效果图像的手绘效果手绘图像的基本思想是利用像素之间的梯度值(而不是像素本身)重构每个像素值。为了体现光照效果,设计一个光源,建立光源对各点梯度值的影响函数,进而运算出新的像素值,从而体现边界点灰度变化,形成手绘效果。图像的手绘效果具体来说,为了更好体现立体感,增加一个z方向梯度值,并给x和y方向梯度值赋权值depth。这种坐标空间变化相当于给物体加上一个虚拟光源,根据灰度值大小模拟各部分相对于人视角的远近程度,使画面显得有“深度”。图像的手绘效果在利用梯度重构图像时,对应不同梯度取0‐255之间不同的灰度值,depth的作用就在于调节这个对应关系。depth较小时,背景区域接近白色,画面显示轮廓描绘;depth较大时,整体画面灰度值较深,近似于浮雕效果图像的手绘效果将光源定义为三个参数:方位角vec_az、俯视角vec_el和深度权值depth。两个角度的设定和单位向量构成了基础的柱坐标系,体现物体相对于虚拟光源的位置,如实例代码19.1的第4到6行。图像的手绘效果通过np.gradient()函数计算图像梯度值作为新色彩计算的基础。为了更直观的进行计算,可以把角度对应的柱坐标转化为xyz立体坐标系。dx、dy、dz是像素点在施加模拟光源后在x、y、z方向上明暗度变化的加权向量,如代码13到15行图像的手绘效果A是梯度幅值,也是梯度大小。各个方向上总梯度除以幅值得到每个像素单元的梯度值。利用每个单元的梯度值和方向加权向量合成灰度值,clip函数用预防溢出,并归一化到0‐255区间。最后从数组中恢复图像并保存。思考与练习:[E10.6]numpy的ndarray类型表示的彩色图像是几维?[E10.7]如何将彩色图片转换成灰度图片?之后如何处理每一个像素?[E10.8]哪个函数能将numpy的ndarray类型变成图像?模块11matplotlib库的使用要点matplotlib是提供数据绘图功能的第三方库,其pyplot子库主要用于实现各种数据展示图形的绘制。matplotlib.pyplot库概述matplotlib.pyplot是matplotlib的子库,引用方式如下:importmatplotlib.pyplotasplt上述语句与importmatplotlib.pyplot一致,as保留字与import一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在后续程序中,plt将代替matplotlib.pyplot。matplotlib.pyplot库概述为了正确显示中文字体,请用以下代码更改默认设置,其中'SimHei'表示黑体字。matplotlib.pyplot库概述matplotlib库由一系列有组织有隶属关系的对象构成,这对于基础绘图操作来说显得过于复杂。因此,matplotlib提供了一套快捷命令式的绘图接口函数,即pyplot子模块。pyplot将绘图所需要的对象构建过程封装在函数中,对用户提供了更加友好的接口。pyplot模块提供一批预定义的绘图函数,大多数函数可以从函数名辨别它的功能。拓展:字体字体是计算机显示字符的方式,均由人工设计,并采用字体库方式部署在计算机中。西文和中文字体都有很多种类,下表给出最常用的10种中文字体及其英文表示,

1 / 128
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功