《第14章 科学计算和可视化应用.ppt》由会员分享,可在线阅读,更多相关《第14章 科学计算和可视化应用.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程主讲人:第14章 科学计算和可视化应用第第14章章 科学计算和可视化应用科学计算和可视化应用主讲主讲 夏敏捷夏敏捷计算机学院副教授计算机学院副教授科学计算和可视化应用 NumPy是非常有名的Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量、矩阵、图像等)以及线性代数函数。 Matplotlib是Python的2D&3D绘图库,它提供了一整套和MATLAB相似的命令API,十分适合交互式地进行绘图和可视化,我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时,Matplotlib是个很好的类库,具有比PIL更强大的绘图功能。NumPy 可以从免费下载
2、其主要功能如下:ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。用于对整组数据进行快速运算的标准数学函数(无需编写循环)。用于读写磁盘数据的工具以及用于操作内存映射文件的工具。线性代数、随机数生成以及傅里叶变换功能。用于集成由C、C+、Fortran等语言编写的代码的工具。14.1 Numpy库的使用库的使用14.1.1 Numpy数组 NumPy库中处理的最基础数据类型是同种元素构成的数组(ndarray)。NumPy数组是一个多维数组对象,称为ndarray。 NumPy数组的下标从0开始。 同一个NumPy数组中所有元素的类型必须是相同的。14.1.1 Nu
3、mpy数组2 2创建创建NumpyNumpy数组数组可以使用array函数从常规的Python列表和元组创造数组。 from numpy import * a = array( 2,3,4 )可使用双重序列来表示二维的数组,三重序列表示三维数组,以此类推。 b = array( (1.5,2,3), (4,5,6) ) b array( 1.5, 2. , 3. , 4. , 5. , 6. )14.1.1 Numpy数组用函数zeros可创建一个全是0的数组,用函数ones可创建一个全为1的数组,函数empty创建一个内容随机的数组。NumPy提供2个类似range的函数返回一个数列形式的数
4、组。(1)arange函数import numpy as npnp.arange(0, 1, 0.1) #步长0.1array( 0. ,0.1,0.2, 0.3,0.4, 0.5,0.6, 0.7,0.8, 0.9)(2)linspace函数通过指定开始值、终值和元素个数(默认为50)来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值: np.linspace(0, 1, 5)array( 0. , 0.25, 0.5 , 0.75, 1. )14.1.1 Numpy数组Numpy 库有一般 math 库函数的数组实现;如sin,cos,log。基本函数(三角
5、、对数、平方和立方等)的使用就是在函数前加上np.这样就能实现数组的函数计算。x=np.arange(0,np.pi/2,0.1) xarray(0. ,0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ,1.1, 1.2, 1.3, 1.4, 1.5) y=np.sin(x)array( 0.,0.09983342,0.19866933, 0.29552021,0.38941834,0.47942554, 0.56464247,0.64421769, 0.71735609,0.78332691,0.84147098, 0.89120736,0.9
6、3203909, 0.96355819,0.98544973,0.99749499)14.1.1 Numpy数组 3 3NumPyNumPy中的数据类型中的数据类型14.1.1 Numpy数组 4 4NumpyNumpy数组中的元素访问数组中的元素访问 数组切片得到的是原始数组的视图,所有修改都会直接反映到源数组。如果需要得到Numpy数组(ndanay)切片的一份副本,需要进行复制操作,比如b5:8.copy()。14.1.2 Numpy数组的算术运算Numpy数组的算术运算是按元素逐个运算。Numpy数组运算后将创建包含运算结果的新数组。import numpy as np a= np.a
7、rray(20,30,40,50) b= np.arange( 4) #相当于np.arange(0, 4) b 输出:array(0, 1, 2, 3) c= a-b c 输出:array(20, 29, 38, 47) 14.1.2 Numpy数组的算术运算 与其他矩阵语言不同,NumPy中的乘法运算符*按元素逐个计算,矩阵乘法可以使用dot函数或创建矩阵对象实现。import numpy as np A= np.array(1,1, 0,1) B= np.array(2,0, 3,4) A*B # 逐个元素相乘 array(2, 0, 0, 4) np.dot(A,B) # 矩阵相乘 a
8、rray(5, 4, 3, 4) 14.1.3 Numpy数组的形状操作1 1数组的形状数组的形状数组的形状取决于其每个轴上的元素个数。 a=np.int32(100*np.random.random(3,4) #3*4整数数组 a.shape #(3, 4)2 2更改数组的形状更改数组的形状可以用多种方式修改数组的形状:reshape() shape() 、resize()和ravel() a.ravel() # 平坦化数组 array(26, 11, 0, 41, 48, 9, 93, 38, 73, 55, 8, 81) a.resize(2,6)14.1.4 文件存取数组内容NumPy
9、提供了多种文件操作函数方便我们存取数组内容。使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件。tofile输出的数据没有格式,因此用numpy.fromfile读回来的时候需要自己格式化数据: a = np.arange(0,12) a.shape = 3,4 # 改成3*4数组 aarray( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) a.tofile(a.bin) b = np.fromfile(a.bin, dtype=np.int32) # 按照int32类型读入数据 b # 数据是一维的array( 0, 1, 2, 3,
10、4, 5, 6, 7, 8, 9, 10, 11) b.shape = 3, 4 # 按照a的shape修改b的shape14.1.5 Numpy中图像数组1 1获取图像数组获取图像数组当载入图像时,我们通过调用array()方法将图像转换成NumPy的数组对象。对于图像数据,下面的例子阐述了这一点:im = array(Image.open(d:test.jpg) #彩色图像print (im.shape, im.dtype)im = array(Image.open(d:test.jpg).convert(L),f) #灰度化处理print (im.shape, im.dtype)输出结果
11、如下所示:(800, 569, 3) uint8(800, 569) float322 2利用图像数组进行灰度变换利用图像数组进行灰度变换将图像读入NumPy 数组对象后,我们可以对它们执行任意数学操作。from PIL import Imagefrom numpy import *im = array(Image.open(empire.jpg).convert(L)im2 = 255 - im # 对图像进行反相处理im3 = (100.0/255) * im + 100 # 将图像像素值变换到100.200 区间im4 = 255.0 * (im/255.0)*2 # 对图像像素值求平方
12、后得到的图像3 3图像缩放图像缩放NumPy的数组对象是我们处理图像和数据的主要工具。想要对图像进行缩放处理没有现成简单的方法。我们可以使用之前PIL对图像对象转换的操作,写一个简单的用于图像缩放的函数。def imresize(im,sz): 使用PIL 对象重新定义图像数组的大小pil_im = Image.fromarray(uint8(im)return array(pil_im.resize(sz) 4 4直方图均衡化直方图均衡化 直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化
13、的一个非常好的方法,并且可以增强图像的对比度。14.2 Matplotlib绘图可视化 Matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条Line2D、文字Text、刻度等都有一个对象与之对应。 为了方便快速绘图,Matplotlib通过pyplot模块提供了一套和MATLAB类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。我们只需要调用pyplot模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。14.2.1 Matplotlib.pyplot模块 # plot a sine wave from 0 to 4pi impo
14、rt matplotlib.pyplot as plt from numpy import * #也可以使用 from pylab import * plt.figure(figsize=(8,4) #创建一个绘图对象,大小为800*400 x_values = arange(0.0, math.pi * 4, 0.01) #步长0.01,初始值0.0,终值4 y_values = sin(x_values) plt.plot(x_values, y_values, b-, linewidth=1.0, label($sin(x)$) #进行绘图 plt. xlabel(x ) #设置X轴的文
15、字 plt. ylabel(sin(x) #设置Y轴的文字 plt.ylim(-1, 1) #设置Y轴的范围 plt. title(Simple plot) #设置图表的标题 plt.legend() #显示图例(legend) plt.grid(True) plt.savefig(sin.png) plt.show() 简单的绘制正弦三角函数简单的绘制正弦三角函数y=sin(x)的例子的例子14.2.1 Matplotlib.pyplot模块14.2.1 Matplotlib.pyplot模块1. 1.调用调用figurefigure创建一个绘图对象创建一个绘图对象2. 2.通过调用通过调用
16、plotplot函数在当前的绘图对象中进行绘图函数在当前的绘图对象中进行绘图3. 3.设置绘图对象的各个属性设置绘图对象的各个属性xlabel、ylabel:分别设置X、Y轴的标题文字。title:设置图的标题。xlim、ylim:分别设置X、Y轴的显示范围。legend():显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。4 4清空清空pltplt绘制的内容绘制的内容 plt.cla() #清空plt绘制的内容 plt.close(0) # 关闭0号图 plt.close(all) # 关闭所有图14.2.1 Matplotlib.pyplot模块5 5图形保存和输出设置图
17、形保存和输出设置plt.savefig(test.png,dpi=120)6. 6. 绘制多子图绘制多子图可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:subplot(numRows, numCols, plotNum)7 7调节轴之间的间距和轴与边框之间的距离调节轴之间的间距和轴与边框之间的距离8 8绘制多幅图表绘制多幅图表14.2.2 绘制条形图、饼状图、散点图等matplotlib是一个Python的绘图库,使用其绘制出来的图形效果和MATLAB下绘制的图形类似。pyplot模块提供了14个用于绘制“基础图表”的常用函数。14.2.2 绘制条形图、饼状图、散点图
18、等plt库提供了3个区域填充函数,对绘图区域填充颜色1直方图(histograms)直方图(histogram)又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。直方图的绘制通过pyplot中的hist()来实现。pyplot.hist(x, bins=10, color=None, range=None, rwidth=None, normed=False, orientation=uvertical, *kwargs)2条形图(bar)条形统计图是用一个单位长度表示一定的数量,根据数量的多少画成长短不同的直条,
19、然后把这些直条按一定的顺序排列起来。从条形统计图中很容易看出各种数量的多少。条形图的绘制通过pyplot中的bar( )或者是barh( )来实现。bar默认是绘制竖直方向的条形图,也可以通过设置 orientation = horizontal 参数来绘制水平方向的。barh( )就是绘制水平方向的条形图。层叠的条形图实例条形图实例3散点图(scatter)散点图(scatter diagram),在回归分析中是数据点在直角坐标系平面上的分布图。一般用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。使用pyplot中的scatter ( )绘制
20、散点图。4饼状图(Pie Graph)饼状图(Sector Graph又名Pie Graph)显示一个数据系列中各项的大小与各项总和的比例,饼状图中的数据点显示为整个饼状图的百分比。使用pyplot中的pie( )绘制饼状图。14.2.3 交互式标注有时用户需要和某些应用交互,例如在一幅图像中标记一些点,或者标注一些训练数据。matplotlib.pyplot库中的ginput() 函数就可以实现交互式标注。#交互式标注from PIL import Image from numpy import *import matplotlib.pyplot as plt im = array(Image.open(d:test.jpg) plt.imshow(im) print (Please click 3 points) x = plt.ginput(3) print (you clicked:,x )plt.show()等待用户在绘图窗口的图等待用户在绘图窗口的图像区域点击三次。程序将像区域点击三次。程序将这些点击的坐标这些点击的坐标x, y自动自动保存在保存在x列表里。列表里。