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