第5章 现代智能信息处理开发 5.1 开发语言基础 5.1.1 Python语言基础 Python的第一个编译器由GuidovanRossum 于1989年发明,并在1991年公开发行。 Python是一种易写易读、功能强大、可以跨平台的解释型编程语言。由于其内置的标准库 和第三方库的支持,因此可以利用该编程语言进行各种复杂的科学计算。经过多年的发展, Python在数据处理、人工智能、网页开发等领域已有广泛应用。本章仅介绍Python的一些 基础知识和几种处理数据扩展库的使用,如果你对这些内容非常了解。 1)Python的安装 Python的安装很简单,进入Python官方网站https://www.python.org,单击Downloads, 然后选择想要的版本号进行下载。安装完成后,可以在终端窗口输入“python”命令查看计 算机是否已经安装成功,以及安装的Python版本。Linux系统一般都自带Python支持,不 需要重复安装,只要升级版本就行。 2)扩展库的安装 进行数值分析时,Python需要利用pip导入相关的扩展库,如果有搭建Anaconda的 话,则不需要自行导入,其一般都自带常用的工具库(NumPy、SciPy、Matplotlib)。可以访问 网址https://www.anaconda.com 下载相关资源和文档。pip提供了对Python包的查找、 下载、安装、卸载等功能,下面列出pip的常用命令。 ● 安装模块:pipinstall<包名>。 ● 卸载模块:pipuninstall<包名>。 ● 查找模块:pipfreeze或piplist。 ● 升级模块:pipinstall--upgrade<包名>。 1.Python基础知识 Python中不需要声明变量,通过赋值操作便可创建不同类型的数据类型。Python中有5 种标准的数据类型:字符串(Strings)、列表(List)、元组(Tuple)、字典(Dictionary)、集合(Set)。 1)字符串(Strings) 字符串通过引号进行创建,在实际编程中通常会接触大量的字符串操作,下面简要介绍 一些字符串的基本操作。 表5-1令a为字符串"intelligent",b为字符串"communication"。 第5 章 现代智能信息处理开发 表5-1 字符串输入与输出 输 入输 出 a+b #连接字符串intelligentcommunication a*2 #连续输出字符串intelligentintelligent a[2] #输出指定位置字符t a[2:4] #截取字符串te 'o'ina #判断a中是否包含字符'o' False 'b' notina#判断a中是否不包含字符'b' True Python中也存在大量针对字符串的内建函数,使用这些函数可以极大地简化代码,而 且运行时更加稳定、快速。下面介绍一些常用内建函数的使用(见表5-2),详细的函数介绍 可以参考Python官方文档。 表5-2 常用的内建函数 函 数描 述 max(str)、min(str) 返回字符串中最大的字母、最小的字母 str.capitalize() 把字符串的第一个字母大写 str.center(L) str居中,用空格填充至长度L str.ljust(L) str左对齐,用空格填充至长度L str.rjust(L) str右对齐,用空格填充至长度L str.isdigit() 若str中存在数字,则返回True,否则返回False str.join(li) 用str连接li字符串中的每个元素 str.lower() str中所有大写字符转小写 str.upper() str中所有小写字符转大写 str.lstrip() 去掉str中最左边的空格 str.rstrip() 去掉str中最右边的空格 2)列表(List) Python中没有数组,但是有更加强大的列表,同样是把所有元素放在一对方括号“[]” 中,各元素用“,”隔开。不同的是,列表内可以存放数、字符串、列表、元组、集合等Python可 以支持的任何数据类型,并且同一列表可以存放不同的元素类型。对于列表,主要介绍关于 列表添加、删除、修改、查找,以及切片的内容。 ● 添加元素 有三种方法可用来添加元素,见表5-3。 表5-3 添加元素的方法 方 法描 述 lis.append(obj) 把obj整体添加到列表lis末尾 lis.extend(obj) 把obj中的元素依次添加到列表lis末尾 lis.insert(index,obj) 在列表lis对应索引位置添加整体的obj 209 ● 删除元素 有四种方法可用来删除元素,见表5-4。 表5-4 删除元素的方法 方 法描 述 dellistname[index] 删除指定位置元素 listname.pop(index) 删除指定位置元素 listname.remove(num) 删除列表中第一个num,若没有,则报错 listname.clear() 清空列表 ● 修改元素 可以修改单个元素和一组元素,见表5-5。 表5-5 修改元素的方法 方 法描 述 listname[index]=num 直接修改位置元素为num listname[index1:index2]=[…] 切片修改一组元素 ● 查找元素 有两种方法可进行查找,见表5-6。 表5-6 查找元素的方法 方 法描 述 listname.index(num,index1,index2) 查找元素出现的位置 listname.count(num) 统计元素出现的次数 ● 切片 切片是处理列表的一种十分重要的操作,在字符串、元组等对象中有广泛的应用。表5-7 举例说明切片操作,有列表lis=[a' ',b' ',c' ',d' ',e' ',f' ']。 表5-7 切片操作 操 作输 出操 作输 出 lis[∶] [a' ',b' ',c' ',d' ',e' ',f' '] lis[∷-2] [f' ',d' ',b' '] lis[1:3] [b' ',c' '] lis[∷2] [a' ',c' ',e' '] 3)元组(Tuple) 元组是Python中另一个重要的序列结构,和列表类似,元组也由一系列按特定顺序排 序的元素组成。元组和列表的不同之处在于: (1)列表的元素是可以更改的,包括修改元素值、删除和插入元素,所以列表是可变 序列; (2)而元组一旦被创建,它的元素就不可更改了,所以元组是不可变序列。 210 第5 章 现代智能信息处理开发 元组也可以看作不可变的列表,通常,元组用于保存无须修改的内容。因为元组与列表 十分相似,所以就不过多列举。元组的主要操作如表5-8所示。 表5-8 元组的主要操作 操 作描 述 tupl=(num1,num2,…,numn) 创建元组 tupl[index] 访问元素 tupl=(num1,num2,…,numn) tupl=(str1,str2,…,strn) 元组不能修改,只能用新的元组覆盖旧的元组 deltupl 删除元组 4)字典(Dictionary) Python字典是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。 字典的每个元素的“键”和“值”用冒号“:”分割,每个对之间用逗号“,”隔开,所有元素都在 一对花括号“{}”里。 字典中的“键”必须是唯一的,可以是实数、字符串、元组等,但是值不一定,值可以重复。 下面介绍一些字典常用的操作和内置函数的使用,见表5-9。 表5-9 字典常用的操作和内置函数的使用 方 法描述/结果 dict={a' ':1,b' ':2} 或x=dict(a=1,b=2) 创建字典 dict={a' ':1,b' ':2} print(dict[a' ']) 访问字典里的值,输出1 dict={a' ':1,b' ':2} dict['b']=3 print(dict) 修改元素的值 输出{a' ':1,b' ':3} dict={a' ':1,b' ':2} deldict[a' '] print(dict) 删除元素的值 输出{'b':2} dict={a' ':1,b' ':2} dict.update({c' ':3,d' ':4}) print(dict) 添加元素 输出{a' ':1,b' ':2,c' ':3,d' ':4} dict={a' ':1,b' ':2} print(dict.keys()) 返回字典中所有的键 输出dict_keys([a' ',b' ']) dict={a' ':1,b' ':2} print(dict.values()) 返回字典中所有的值 输出dict_values([1,2]) dict={a' ':1,b' ':2} print(dict.items()) 返回字典中所有的键值对 输出dict_items([(a' ',1),(b' ',2)]) dict={a' ':1,b' ':2} print(list(dict.items())) 将返回的数据转换成列表 输出[(a' ',1),(b' ',2)] 211 5)集合(Set) Python集合会将所有元素放在一对花括号“{}”中,相邻元素之间用“,”分隔。集合中 的元素不能重复,每个元素都是唯一的。表5-10显示了集合的基本操作。 表5-10 集合的基本操作 方 法结 果 set={element1,element2} 或setname=set(列表/元组/range对象) 创建集合 set={a' '} set.add('b') 向集合添加元素 输出{a' ',b' '} set={a' ',b' '} set.remove(a' ')或set.pop() 从集合中删除元素 都输出{'b'} set1={a' ',b' '} set2={a' ',c' '} print(set1&set2) print(set1|set2) print(set1-set2) 集合的交集、并集、差集 分别输出 {a' '} {a' ',c' ',b' '} {'b'} 6)函数 Python里用def关键词定义函数,后接函数标识符名称和圆括号“()”。简单举例如下。 def obj(): set={'a','b'} for i in set: #输出集合中的每个元素 print(i) obj() 2.Python扩展模块及可视化 接下来介绍Python中用于科学计算的4种常用扩展包:NumPy、Pandas、Matplotlib、 SciPy。相关程序运行结果通过JupyterNotebook展示,这一工具能直接在网页上编写和执 行Python代码,相关运行结果也能在代码块下显现。有关Jupyter的安装和操作可以参考 Jupyter的官网http://jupyter.org/index.html。 1)NumPy NumPy是使用Python进行科学计算的基础包,可提供数组支持以及相应的高效处理 函数。相比于Python的内置序列,NumPy数组的执行效率更好,代码量更少。NumPy也 是Scipy、Pandas等数据处理和科学计算库最基本的函数功能库,Matplotlib同样也需要 NumPy的支持。 通常使用Python包管理器pip安装numpy:pipinstallnumpy。 numpy包的导入:importnumpyasnp。 ● 创建数组 可以通过转换Python中的列表和元组创建数组,也可以使用NumPy数组创建函数以 及其他特殊的库函数来创建数组。 导入numpy包:importnumpyasnp。 212 第 5 章现代智能信息处理开发 表5-11 创建数组的方法 操作 a=p. ra1,3)) nay((2, 或a=p. ray([1,3]) na2, print(a) a=np. ray([[1,2],[3,4]]) print(a)(a) a=p.nge(2,2) na10, print(a)(r) (a) a=p.isae(10,dyp=n nlnpc2,2,teit) print(a) ● 数组索引 ” 描述/输出 创建一维数组 [123] 创建二维数组 [[12] [34]] 用内置函数,规定开始、结束和步长 [2468] 用内置函数,规定开始、结束和数量 [210] 可以使用方括号“[]索引数组值,通过下标索引单一元素值,通过切片指向元素连续的 多个元素值。 表5-12 数组索引的方法 操作 a=np. ray([1,2,3,4,5]) print(a[2(a) ]) a=np. ray([1,2,3,4,5]) print(a[1(a) :3]) 2,4,6]]) b=(a(a) >3) print(b) =np. ray([[1,3],[5, a=aray([1,2,3,4,5] ) a[1:3](n) = 1 print(a) p. ● 数组的相关运算(见表5-13) 描述/输出 单元素索引 3 [ 切片操作,多元素索引 23] 布尔索引 [[FalseFalseFalse] [TrueTrueTrue]] 索引赋值 [11145] 表5-13 数组的相关运算 操作 a=p. ray([[1,2],[3,4]]) naprina. t(T) a=p. ray([1,2]) nab=p. ra3, nay([4]) prnndt(b)) it(p.oa, 描述/输出 数组转置 [[13] [24]] 向量点积 11 213 续表 操作 a=naray([1,2,3]) p. print(a*2) print(a/2) print(a**2) a=p. ray([1,2]) na nay([[2],[4]] ) b=p. ra1,3, print(a*b) a=p. ray([[1,3],[5,2,4]]) na2,4,0, prit(p.ot( nnsra)) p.y([[3],[4]])a=nara2,1,4,5,0,2, prit(nsrt(a,xs0)) np.oai= 描述/输出 数组的乘、除、平方 [246] [0.5] 51.1. [149] 数组间的乘法运算 [[14] [38]] 数组按行排序 [[1234] [0245]] 数组按列排序 [[2023] [5144]] 2)Matplotlib绘图 Matplotlib是基于NumPy的一套Python包,这个包提供了一系列的数据绘图工具,可 以将很多数据以线条图、饼图、柱状图及其他专业图形呈现出来。通常使用Python包管理 器pip安装matplotlib:pipinstalmatplotlib。 pmpppypsp Matlotlib包的导入:iortmatlotlib.lotalt importmatplotlib 。 (1)散点图( 1)。 见图5. 图5.散点图 1 214 第 5 章现代智能信息处理开发 (2)柱形图( 2)。 见图5. 图5.柱形图 2 (3)饼图( 3)。 见图5. 图5.饼图 3 (4)多线图( 4) 。 ( 见图5.5) 。 5)三维曲线(见图5. 3.SciPy SciPy在NumPy的基础上添加了更多用于科学计算的模块,包括统计、优化、整合、线 性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等。SciPy依赖于NumPy,并 215 图5.多线图 4 图5.三维曲线 5 提供许多如数值积分和优化这样的数值例程。 下面列举一个SciPy关于信号处理的应用( 6),scisina 号处。 见图5.py.gl模块专门用于信 216 第 5 章现代智能信息处理开发 scsnlrsle(): 采样(ampi)。 ipy.iga.eampSlngscsnldted():去除线性趋势(Elmntierted)。 ipy.iga.erniiaelnarn 图5.Py关于信号处理的应用 6 Sci 4.Scikit-ln Scikit-learn(e) 是(a) 一个功能强大的Pyt(r) hon机器学习库,为实现各种监督和半监督机器学习 算法提供了简单、高效的工具。Scikit-learn是开源的,每个人都能访问。它基于NumPy、 SciPy和Matplolib构建,极大地提高了它的可靠性和健壮性。Scikit-learn内置丰富的数据 集,如鸢尾花等,是一个简单高效的数据挖掘和数据分析工具。 Scikit主要分为6个模块:分类、回归、聚类、降维、模型选择和预处理。机器学习算法 主要有近邻分类算法、线性回归分类算法、随机森林分类算法、决策树分类算法、支持向量 机、神经网络等。使用Scikit-learn训练模型的步骤如下。 ● 导入模块 ● 读入数据 217