《Python语言基础及应用》习题答案汇总 江晓林 第1-10章_第1页
《Python语言基础及应用》习题答案汇总 江晓林 第1-10章_第2页
《Python语言基础及应用》习题答案汇总 江晓林 第1-10章_第3页
《Python语言基础及应用》习题答案汇总 江晓林 第1-10章_第4页
《Python语言基础及应用》习题答案汇总 江晓林 第1-10章_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第1章无第2章1.将你最喜欢的数字存储在一个变量中,再使用这个变量创建一条消息,指出你最喜欢的数字,然后将这条消息打印出来。favorite_number=7message="Myfavoritenumberis"+str(favorite_number)+"."print(message)2.将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“HelloEric,wouldyouliketolearnsomePythontoday?”。#获取用户的姓名name=input("请输入您的姓名:")#显示消息print("Hello"+name+",wouldyouliketolearnsomePythontoday?")3.将一个人名存储到一个变量中,再以小写、大写和首字母大写的方式显示这个人名。#存储人名到变量中person_name="JohnDoe"#小写显示print("小写:",person_name.lower())#大写显示print("大写:",person_name.upper())#首字母大写显示print("首字母大写:",person_name.capitalize())4.找一句你钦佩的名人说的名言,将名人的姓名存储在变量famous_person中,将他的名言连同姓名存储在变量message中。然后打印message。输出应类似于下面这样(包括引号,\t,\n):AlbertEinsteinoncesaid:“Apersonwhonevermadeamistakenevertriedanythingnew.”famous_person="AlbertEinstein"message=f"{famous_person}oncesaid:\n\"Apersonwhonevermadeamistakenevertriedanythingnew.\""print(message)5.编写一个程序,将温度从华氏温度转换为摄氏温度。fahrenheit=float(input("请输入华氏温度:"))celsius=(fahrenheit-32)*5/9print("摄氏温度为:",celsius)6.编写一个程序以执行你自己选择的单位转换。确保程序打印介绍,解释它的作用。print("这个程序用于将英寸转换为厘米。")inches=float(input("请输入英寸值:"))cm=inches*2.54print(f"{inches}英寸等于{cm}厘米。")第3章1. 请在list=[1,2,3,4,5,6,7,8,9]中的索引为2的位置的后面插入多个数字(元素):78,89,76,23,78,89,76,23>>>list=[1,2,3,4,5,6,7,8,9]>>>list=list[:2]+[78,89,76,23]+list[2:]>>>list[1,2,78,89,76,23,3,4,5,6,7,8,9]>>>list=[1,2,3,4,5,6,7,8,9]>>>j=2>>>foriin[78,89,76,23]:...list.insert(j,i)...j+=1...>>>list[1,2,78,89,76,23,3,4,5,6,7,8,9]2. 求一句英文句子(Thisisapen)的单词数。>>> sentence="Thisisapen">>> words=sentence.split()>>> print(len(words))3. 在一行中输入若干个整数(至少输入一个整数),整数之间用空格分割,要求将数据按从小到大排序输出。>>> n=input(‘请输入若干个整数,整数间用空格分割:’) >>> nn=n.split() #分割字符串>>> nn=[int(i)foriinnn] #将字符串型转为整数型>>> nn.sort() #排序4. 对列表mailto=['cc','bbbb','afa','sss','bbbb','cc','shafa']进行去重操作,并保持原有顺序。mailto=['cc','bbbb','afa','sss','bbbb','cc','shafa']addr_to=list(set(mailto))print(addr_to)addr_to.sort(key=mailto.index)print(addr_to)5. 编写程序。新建一个空列表,向其中添加10名同学的成绩(百分制)。显示此列表中所有成绩的最高成绩,最低成绩,平均成绩。将列表降序排序后,使用切片显示前三名成绩,后三名的成绩,排在第3名到第5名成绩;使用切片在列表首部插入一个100分,在尾部追加一个0分;使用切片将此时的列表的后五个数全部替换为60;使用切片删除倒数第1,3,5三个数;最后显示所有的成绩。list=[]#建立空列表foriinrange(1,11,1):cj=int(input("请输入成绩"))list.append(cj)list.sort(reverse=1)#列表排序print("最高成绩",list[0])#输出最高成绩print("最低成绩",list[9])#输出最低成绩m=sum(list)print("平均成绩",m/10)#输出平均成绩print("前三名成绩",list[0:3:1])#输出前三名成绩print("排在第3名到第5名成绩",list[2:5:1])#输出排在第3名到第5名成绩print("后三名成绩",list[7:10:1])#输出后三名成绩list[:0]=[100]#在首部插入100分list[11:]=[0]#在尾部追加一个0分list[7:]=[60,60,60,60,60]#替换列表后5个数为60dellist[11:12]#删除倒数第一个数dellist[9:10]#删除倒数第三个数dellist[7:8]#删除倒数第五个数print(list)6. 要求输入一个四位数的年,判断当前的年份的生肖。生肖纪年顺序为:子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪。#地支算法:用公元纪年-3,除以12所得余数,即为对应的年。所以生肖顺序相应变更['申猴','酉鸡','戌狗','亥猪','子鼠','丑牛','寅虎','卯兔','辰龙','巳蛇','午马','未羊']year=int(input('输入一个四位数的年份:'))print(year)varlist=['申猴','酉鸡','戌狗','亥猪','子鼠','丑牛','寅虎','卯兔','辰龙','巳蛇','午马','未羊']print(varlist[year%12])第4章1.根据输入第一个和第二个的英文字母,判断是星期几'''周一Monday周二Tuesday周三Wednesday周四Thursday周五Fri(Friday)周六Sat(Saturday)周日Sunday'''date=input("请输入第一个字母:").upper()ifdate=='M':print('Monday')elifdate=='T':date=input("请输入第二个字母:").lower()ifdate=='u':print('Tuesday')elifdate=='h':print('Thursday')else:print('输入有误~~~')elifdate=='W':print('Wednesday')elifdate=='F':print('Friday')elifdate=='S':date=input("请输入第二个字母:").lower()ifdate=='a':print('Saturday')elifdate=='u':print('Sunday')else:print('输入有误~~~')else:print('输入有误~~~')2. 登录验证:请输入用户名和密码,判断是否都正确,才能成功登陆。name=input("请输入用户名:")pwd=input("请输入密码")ifname=="name":ifpwd=="123456":print("登录成功!")else:print("密码错误!")else:print("登录名错误!")3. 数字猜谜游戏:猜大了提示:猜的数字大了;猜小了提示:猜的数字小了;猜正确停止。number=5a=0print('欢迎进入猜数字游戏')whilea!=number:a=int(input('请输入要猜的数字'))ifa==number:print('恭喜,猜对了')elifa<number:print('猜小了')elifa>number:print('猜大了')else:print('好好玩哦~')4. 用嵌套循环打印九九乘法表foriinrange(1,10):forjinrange(1,i+1):print("{}*{}={}".format(j,i,i*j),end="")print()5. 用嵌套循环将字符*输出效果:IUimporttimey=2.5whiley>=-1.6:x=-3.0whilex<=4.0:if(x*x+y*y-1)**3<=3.6*x*x*y*y*yor(x>-2.4andx<-2.1andy<1.5andy>-1)or(((x<2.5andx>2.2)or(x>3.4andx<3.7))andy>-1andy<1.5)or(y>-1andy<-0.6andx<3.7andx>2.2):print('*',end="")else:print('',end="")x+=0.1print()time.sleep(0.25)y-=0.26. 通过设置print()函数中的参数end实现加载效果:加载中1%到100%importtimeinner=500forninrange(inner+1):loading=round(n/inner*100)#通过加\r每次输出完跳回,用end=""替换默认的换行,只要数字在改变,因此表面上展现进度刷新print(f"\r加载中{loading}%",end="")#由于没有放入复杂程序,如果直接打印,展示不出效果,因此用time.sleep模拟加载过程time.sleep(0.02)7. 对之前的【状态自评】进行需求扩充。具体要求如下:(10+∞):睡醒了吗,亲[8,10]:今天状态不错,适合学习[6,8):今天状态尚可,用学习稳定心情吧[4,6):今天状态欠佳,用学习提升自己吧[1,4):你或许需要好好休息,或者放松一下(-∞,1):睡醒了吗?amount=int(input('请输入状态自评分【1(十分沮丧)~10(满面红光)】:'))print('******************')ifamount>10oramount<0: print('{0:=^14}'.format('睡醒了吗'))elifamount>=8: print('{0:=^14}'.format('今天状态不错')) print('{0:-^14}'.format('适合学习'))elifamount>=6: print('{0:=^14}'.format('今天状态尚可')) print('{0:-^14}'.format('用学习稳定心情吧'))elifamount>=4: print('{0:=^14}'.format('今天状态欠佳')) print('{0:-^14}'.format('用学习提升自己吧'))else: print('{0:=^14}'.format('你或许需要好好休息')) print('{0:-^14}'.format('或者放松一下'))print('******************')print('希望您度过愉快的一天!')第5章1. 输入两个正整数num1和num2(不超过500),求它们的最小公倍数并输出。方法一deflcm(a,b):foriinrange(min(a,b),0,-1):ifa%i==0andb%i==0:returna*b//inum1=int(input(""))num2=int(input(""))print(lcm(num1,num2))方法二deflcm(a,b):foriinrange(max(a,b),a*b+1):ifi%a==0andi%b==0:returninum1=int(input(""))num2=int(input(""))print(lcm(num1,num2))2. 编写函数,接收字符串参数,返回一个元组,其中第一个元素为大写字母个数,第二个元素为小写字母个数defdemo(s):result=[0,0]forchins:ifch.islower():result[1]+=1elifch.isupper():result[0]+=1returntuple(result)3. 编写函数,接收一个正偶数为参数,输出两个素数,并且这两个素数之和等于原来的正偶数。如果存在多组符合条件的素数,则全部输出。defdemo(n):defIsPrime(p):ifp==2:returnTrueifp%2==0:returnFalseforiinrange(3,int(p**0.5)+1,2):ifp%i==0:returnFalsereturnTrueifisinstance(n,int)andn>0andn%2==0:foriinrange(2,n//2+1):ifIsPrime(i)andIsPrime(n-i):print(i,'+',n-i,'=',n)4. 编写函数,计算字符串匹配的准确率。以打字练习程序为例,假设origin为原始内容,userInput为用户输入的内容,下面的代码用来测试用户输入的准确率。defRate(origin,userInput):ifnot(isinstance(origin,str)andisinstance(userInput,str)):print('Thetwoparametersmustbestrings.')returnright=sum((1foro,uinzip(origin,userInput)ifo==u))returnround(right/len(origin),2)5. 编写函数模拟猜数游戏。系统随机产生一个数,玩家最多可以猜5次,系统会根据玩家的猜测进行提示,玩家则可以根据系统的提示对下一次的猜测进行适当调整。fromrandomimportrandintdefguess(maxValue=100,maxTimes=5):#随机生成一个整数value=randint(1,maxValue)foriinrange(maxTimes):prompt='StarttoGUESS:'ifi==0else'Guessagain:'#使用异常处理结构,防止输入不是数字的情况try:x=int(input(prompt))except:print('Mustinputanintegerbetween1and',maxValue)else:#猜对了ifx==value:print('Congratulations!')breakelifx>value:print('Toobig')else:print('Toolittle')else:#次数用完还没猜对,游戏结束,提示正确答案print('Gameover.FAIL.')print('Thevalueis',value)6. 模拟蒙蒂霍尔悖论游戏。fromrandomimportrandrangedefinit():'''返回一个字典,键为3个门号,值为门后面的物品'''result={i:'goat'foriinrange(3)}r=randrange(3)#在某个随机的门后面放一辆汽车,其他两个门后面仍然是山羊result[r]='car'returnresultdefstartGame():#获取本次游戏中每个门的情况doors=init()#获取玩家选择的门号whileTrue:try:firstDoorNum=int(input('Chooseadoortoopen:'))assert0<=firstDoorNum<=2breakexcept:print('Doornumbermustbebetween{}and{}'.format(0,2))#主持人查看另外两个门后的物品情况#字典的keys()方法返回结果可以当作集合使用,支持使用减法计算差集fordoorindoors.keys()-{firstDoorNum}:#打开其中一个后面为山羊的门ifdoors[door]=='goat':print('"goat"behindthedoor',door)#获取第三个门号,让玩家纠结thirdDoor=(doors.keys()-{door,firstDoorNum}).pop()change=input('Switchto{}?(y/n)'.format(thirdDoor))finalDoorNum=thirdDoorifchange=='y'elsefirstDoorNumifdoors[finalDoorNum]=='goat':return'IWin!'else:return'YouWin.'whileTrue:print('='*30)print(startGame())r=input('Doyouwanttotryoncemore?(y/n)')ifr=='n':Break第6章数据处理1.请将列表数据[1,3,6,15]转化为NumPy数组。(以下代码仅供参考)>>>importnumpyasnp>>>x=np.array([1,3,6,15])>>>print(type(x))2.请基于NumPy编写一个函数,统计给定数组中包含的缺失值NaN的总数。(以下代码仅供参考)>>>importnumpyasnp>>>defnan_counter(x):...print(len(x[np.isnan(x)]))#测试>>>nan_counter(np.array([1,2,3,np.nan,7,np.nan]))3.请使用NumPy分别创建下列数组: (1)由10个5组成的一维数组; (2)由1,7,5,13组成的一维数组; (3)形状为(3,4)的二维数组,其中的数据由10至21之间的整数构成; (4)形状为(3,4)的二维数组,其中的数据由10至21之间的整数构成,再改变其中11至15数字符号为负号。(以下代码仅供参考)>>>importnumpyasnp#由10个5组成的一维数组>>>array1=np.ones(10)*5#由1,7,5,13组成的一维数组>>>array2=np.array([1,7,5,13])#形状为(3,4)的二维数组,其中的数据由10至21之间的整数构成>>>array3=np.arange(10,22).reshape((3,4))#形状为(3,4)的二维数组,其中的数据由10至21之间的整数构成,再改变其中11至15数字的符号为负号>>>array4=np.arange(10,22)>>>array4[1:6]*=-1>>>array4.resize((3,4))4.请使用NumPy计算下列两个矩阵的乘法的结果(以下代码仅供参考)>>>importnumpyasnp>>>A=np.array([[1,3],[2,4]])>>>B=np.array([[-5,3],[7,0]])>>>result=A@B5.请基于NumPy编写一个函数,统计二维数组中所有元素的和、每行元素的以及每列元素的和。(以下代码仅供参考)>>>importnumpyasnp>>>defsum_calculate(x):...array_sum=x.sum()...colunm_sum=x.sum(axis=0)...row_sum=x.sum(axis=1)...returnarray_sum,colunm_sum,row_sum#测试>>>array_sum,colunm_sum,row_sum=sum_calculate(np.array([[1,3],[8,10]]))>>>print('所有元素之和:{}\n每行元素之和:{},{}\n每列元素之和:{},{}'.format(array_sum,row_sum[0],row_sum[1],colunm_sum[0],colunm_sum[1]))6.请使用NumPy创建一个长度为7的一维数组,其中由0到5之间的任意整数填充。(以下代码仅供参考)>>>importnumpyasnp>>>a=np.random.randint(0,5,size=[7])>>>print(a)7.请使用NumPy创建一维数组[1234567891011121314],再将其划分为[12]、[3456789]和[1011121314]三个一维数组。(以下代码仅供参考)>>>importnumpyasnp>>>a=np.arange(1,15)>>>a1,a2,a3=np.split(a,[2,9,])>>>print(a1)>>>print(a2)>>>print(a3)

第7章数据可视化1.请简述在Matplotlib中基于状态的绘图模式与面对对象的绘图模式的区别。基于状态的绘图模式直接基于pyplot的绘图方法,采用类似Matlab的绘图流程进行图例绘制。而面对对象的绘图模式首先需要创建画布(Figure)实例,并对画布中的轴域(Axes)进行实例的添加,可以更细致地控制绘图。两种方法在子图绘制以及标签等实例设置的上的函数有所区别。(此题为主观题型,答案仅供参考)2.请根据“Population2010.csv”文件中的数据绘制2010年的人口金字塔图像,并与7.3.3节中2020年的人口金字塔图像对比,分析该地十年间人口状况的变化。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.style.use('seaborn-whitegrid')>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False>>>np.set_printoptions(suppress=True)#设置不使用科学计数法#导入数据>>>data_2010=np.loadtxt("Population2010.csv",delimiter=",",skiprows=1,usecols=(1,2))>>>male_2010=data_2010[:,0]>>>female_2010=data_2010[:,1]#数据处理>>>age=['{}至{}岁'.format(5*i,5*(i+1)-1)foriinrange(20)]>>>age.append('大于100岁')>>>sum_pop_2010=np.sum(data_2010)>>>male_2010_pct=male_2010/sum_pop_2010>>>female_2010_pct=female_2010/sum_pop_2010>>>str_male_2010_pct=','.join(str('{:.2}%').format(i*100)foriinmale_2010_pct).split(',')>>>str_female_2010_pct=','.join(str('{:.2}%').format(i*100)foriinfemale_2010_pct).split(',')#绘图>>>fig,ax=plt.subplots(figsize=(17,12))>>>fig.tight_layout()>>>bar_male=ax.barh(age,-male_2010,label='男',color='#6699FF')>>>bar_female=ax.barh(age,female_2010,label='女',color='#CC6699')>>>ax.bar_label(bar_male,labels=str_male_2010_pct,size=16,label_type='edge',padding=5)>>>ax.bar_label(bar_female,labels=str_female_2010_pct,size=16,label_type='edge',padding=5)>>>ax.legend(prop={'size':20})>>>ax.set_xticks([-60000000,-40000000,-20000000,0,20000000,40000000,60000000])>>>ax.set_xticklabels([r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$','0',r'$6\times10^7$',r'$4\times10^7$',r'$2\times10^7$'],fontsize=16)>>>ax.set_yticklabels(age,fontsize=16)>>>ax.set_ylabel('年龄段',fontsize=16)>>>ax.set_xlabel('人数',fontsize=16)>>>ax.set_title('2010年人口金字塔',fontsize=25)>>>plt.show()(分析可从年龄结构、性别比例等描述,言之有理即可)3.请采用合适的可视化手段对7.4节中的电商数据“CustomerData.csv”分析所在城市情况、婚姻状况与消费水平的关系。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False#数据读取>>>city=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(6),dtype=np.str_,encoding='utf_8_sig')>>>marital=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(7),dtype=np.str_,encoding='utf_8_sig')>>>purchase=np.loadtxt("CustomerData.csv",delimiter=",",skiprows=1,usecols=(8),encoding='utf_8_sig')#函数定义>>>defgroupby(x):...x_uniques=np.unique(x)...return{xi:np.where(x==xi)forxiinx_uniques}#所在城市>>>city_label,city_data=np.unique(city,return_counts=True)>>>city_index=groupby(city)>>>city_purchase_group={key:purchase[city_index[key]].mean()forkeyincity_index.keys()}>>>city_purchase_label=[iforiincity_purchase_group.keys()]>>>city_purchase_data=[iforiincity_purchase_group.values()]#婚姻状况>>>marital_label,marital_data=np.unique(marital,return_counts=True)>>>marital_index=groupby(marital)>>>marital_purchase_group={key:purchase[marital_index[key]].mean()forkeyinmarital_index.keys()}>>>marital_purchase_label=[iforiinmarital_purchase_group.keys()]>>>marital_purchase_data=[iforiinmarital_purchase_group.values()]#绘图>>>fig,ax=plt.subplots(1,2,figsize=(16,4),dpi=300)>>>ax[0].bar(city_purchase_label,city_purchase_data,color='purple',width=0.3)>>>ax[0].set_xlabel('各城市平均消费额')>>>ax[0].set_ylabel('平均消费额(元)')>>>ax[0].set_title('城市类型',fontsize='20')>>>ax[0].grid();>>>ax[1].bar(marital_purchase_label,marital_purchase_data,color='red',width=0.3)>>>ax[1].set_xlabel('婚姻状态');>>>ax[1].set_ylabel('平均消费额(元)');>>>ax[1].set_title('婚姻状态平均消费额',fontsize='20');>>>ax[1].grid()>>>plt.show()4.请采用合适的可视化手段对7.5节中的气象数据“shanghai_weather.csv”中的风速数据进行分析。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromscipy.statsimportnorm>>>plt.style.use('seaborn-whitegrid')#风格设置>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False#读取数据>>>wind=np.loadtxt('shanghai_weather.csv',delimiter=',',skiprows=1,usecols=(6),dtype=np.str_,encoding='utf_8_sig')>>>wind_speed=np.array([i[-2:]foriinwind])>>>speed_label,speed_data=np.unique(wind_speed,return_counts=True)#绘图>>>fig,ax=plt.subplots(figsize=(16,10),dpi=300)>>>ax.bar(speed_label,speed_data)>>>ax.set_xlabel('风速等级')>>>ax.set_ylabel('天数')>>>ax.set_title('一年中各风速等级的天数',fontsize='20')>>>plt.show()

第8章科学计算1.圆周率的数值可以通过求解单位圆的定积分得到,请使用SciPy库中求解数值积分的方法得到圆周率的数值近似。(以下代码仅供参考)>>>importnumpyasnp>>>fromscipyimportintegrate>>>f=lambdax:np.sqrt(1-x**2)>>>print(2*integrate.quad(f,-1,1)[0])3.14159265358979672.请在SciPy中求解最优化的子模块中选择合适的方法,求解以下目标函数的极小点,初始点选择。(以下代码仅供参考)>>>importnumpyasnp>>>fromscipyimportoptimize>>>f=lambdax:(x[0]**2+x[1]-11)**2-(x[0]+x[1]**2-7)**2>>>x0=np.array([-3.,-1.])>>>res=optimize.minimize(f,x0,method='BFGS')>>>print(res)message:Optimizationterminatedsuccessfully.success:Truestatus:0fun:-108.8527347923513x:[-3.544e+00-7.055e-02]nit:6jac:[1.907e-069.537e-07]hess_inv:[[1.001e-023.135e-03][3.135e-032.370e-02]]nfev:24njev:83.请使用SciPy求解下列线性规划问题(以下代码仅供参考)>>>importnumpyasnp>>>fromscipyimportoptimize>>>c=np.array([-20.,-12.,-40.,-25.])>>>A_ub=np.array([[1.,1.,1.,1.],[3.,2.,1.,0],[0,1.,2.,3.]])>>>b_ub=np.array([50.,100.,90.])>>>res=optimize.linprog(c,A_ub=A_ub,b_ub=b_ub)>>>print(res)message:Optimizationterminatedsuccessfully.(HiGHSStatus7:Optimal)success:Truestatus:0fun:-1900.0x:[5.000e+000.000e+004.500e+010.000e+00]nit:4lower:residual:[5.000e+000.000e+004.500e+010.000e+00]marginals:[0.000e+001.800e+010.000e+002.500e+01]upper:residual:[infinfinfinf]marginals:[0.000e+000.000e+000.000e+000.000e+00]eqlin:residual:[]marginals:[]ineqlin:residual:[0.000e+004.000e+010.000e+00]marginals:[-2.000e+01-0.000e+00-1.000e+01]mip_node_count:0mip_dual_bound:0.0mip_gap:0.04.在8.3.2节中的气象风速数据的插值分析中,请使用erpolate中的UnivariateSpline类对累计分布函数进行插值分析,并与线性插值结果对比。(以下代码仅供参考)>>>importnumpyasnp>>>fromscipyimportinterpolate>>>importmatplotlib.pyplotasplt>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False#读取数据>>>wspeeds=np.load('windspeeds.npy')>>>years=21>>>max_speeds=np.array([arr.max()forarrinnp.array_split(wspeeds,years)])>>>x_data=(np.arange(years)+1)/(years+1)>>>sorted_max_speeds=np.sort(max_speeds)>>>speed_spline=interpolate.UnivariateSpline(x_data,sorted_max_speeds)#根据插值函数生成曲线>>>x_prob=np.linspace(0,1,100)>>>fitted_max_speeds=speed_spline(x_prob)#使用插值函数计算50年重现期最大风速值>>>vmax50=speed_spline(0.98)#可视化>>>plt.figure(figsize=(8,6))>>>plt.plot(sorted_max_speeds,x_data,'bo')>>>plt.plot(fitted_max_speeds,x_prob,'g--')>>>plt.text(31.6,0.5,'$V_{50}=%.2f\,m/s$'%vmax50)>>>plt.plot([vmax50,vmax50],[0,0.98],'k--')>>>plt.plot([20,vmax50],[0.98,0.98],'k--')>>>plt.plot(vmax50,0.98,'ro',markersize=8)>>>plt.xlim([20,36])>>>plt.ylim([0,1])>>>plt.xlabel('风速最大值[$m/s$]')>>>plt.ylabel('累计概率')>>>plt.grid()>>>plt.title('气象站风速累积分布函数插值分析')>>>plt.show()5.请使用绿色填充“Panda.jpg”图像中由围成的正方形区间。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>img=plt.imread('Panda.jpg')>>>img_cover=np.array(img)>>>img_cover[100:300,100:300,:]=np.array([0,255,0])>>>plt.imshow(img_cover)6.请给“Panda.jpg”图像增加随机噪点,并分别使用均值滤波器和中值滤波器对其降噪,比较两种滤波器和高斯滤波器的降噪效果。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromscipyimportndimage>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False>>>img=plt.imread('Panda.jpg')>>>noisy_img=np.array(img).astype(np.float64)>>>noisy_img+=img.std()*1.*np.random.standard_normal(img.shape)>>>noisy_img/=255.#均值滤波>>>uni_filtered_img=np.empty(img.shape)>>>foriinrange(3):...uni_filtered_img[...,i]=ndimage.filters.uniform_filter(noisy_img[...,i],size=20)#中值滤波>>>median_filtered_img=np.empty(img.shape)>>>foriinrange(3):...median_filtered_img[...,i]=ndimage.median_filter(noisy_img[...,i],size=20)#可视化>>>fig,ax=plt.subplots(1,3,figsize=(18,4),dpi=300)>>>ax[0].imshow(noisy_img)>>>ax[0].set_title('噪点图像')>>>ax[1].imshow(uni_filtered_img)>>>ax[1].set_title('均值滤波')>>>ax[2].imshow(median_filtered_img)>>>ax[2].set_title('中值滤波')>>>plt.show()

第9章机器学习1.请简述利用机器学习解决实际应用问题的流程。机器学习的一般流程包括确定分析目标、收集数据、整理数据、预处理数据、训练模型、评估模型、优化模型、上线部署等步骤。首先要从业务的角度分析,然后提取相关的数据进行探查,发现其中的问题,再依据各算法的特点选择合适的模型进行实验验证,评估各模型的结果,最终选择合适的模型进行应用。2.在9.2节的手写数字识别任务中,请实验正则项系数对模型性能的影响。(以下代码仅供参考)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromsklearnimportdatasets,metrics>>>fromsklearn.model_selectionimporttrain_test_split>>>fromsklearn.datasetsimportfetch_openml>>>fromsklearn.utilsimportcheck_random_state>>>fromsklearn.preprocessingimportStandardScaler>>>fromsklearn.linear_modelimportLogisticRegression#下载数据>>>X,y=fetch_openml("mnist_784",version=1,return_X_y=True,as_frame=False)#数据预处理>>>defscaler_input(data):...scaler=StandardScaler()...data=scaler.fit_transform(data)...returndata>>>X_scaler=scaler_input(X)#数据划分>>>deftrain_validation_split(X,y,train_size):...random_state=check_random_state(0)...permutation=random_state.permutation(X.shape[0])...X=X[permutation]...y=y[permutation]...X=X.reshape((X.shape[0],-1))...X_train,X_val,y_train,y_val=train_test_split(X,y,train_size=train_size)...returnX_train,X_val,y_train,y_val>>>X_train,X_val,y_train,y_val=train_validation_split(X,y,0.9)#设置正则系数>>>c_list=[0.0001,0.0005,0.001,0.005,0.01,0.05]#训练>>>model_list=[]>>>foriinc_list:...model=LogisticRegression(C=i,penalty="l1",solver="saga",max_iter=500)...model.fit(X_train,y_train)...model_list.append(model)#输出结果>>>foriinrange(len(c_list)):...score=model_list[i].score(X_val,y_val)...print('当L1惩罚系数为{}时的验证集分数为:{:.4f}'.format(c_list[i],score))3.在9.3节的交通车流量预测任务中,还可使用其他回归算法进行预测。请设计基于支持向量机回归(sklearn.svm.SVR)的模型并实验核函数在支持向量机中对结果的影响。(以下代码仅供参考)>>>importnumpyasnp>>>importpandasaspd>>>importmatplotlib.pyplotasplt>>>fromsklearnimportsvm>>>fromsklearnimportmetrics>>>fromsklearn.preprocessingimportMinMaxScaler>>>df=pd.read_csv('Traffic_flow.csv',encoding='gb2312')>>>data=np.array(df)>>>defbuild_train_model():#保存模型的字典...models={}...forkernelin('linear','poly-3','poly-5','rbf','laplacian'):...if'poly'inkernel:...clf=svm.SVR(kernel='poly',gamma=2,degree=int(kernel[-1]))...else:...clf=svm.SVR(kernel=kernel,gamma=2)...clf.fit(X_train,y_train)...models[kernel]=clf...returnmodels>>>defmaek_predict(models,data):...result={}...forname,modelinmodels.items():...result[name]=model.predict(data)...returnresult>>>defmodels_score(label,predicts):...models_score={}>>>defcalculate_score(label,predicted):...score={}...score['r2']=metrics.r2_score(label,predicted)...score['mae']=metrics.mean_absolute_error(label,predicted)...score['mse']=metrics.mean_squared_error(label,predicted)...score['max']=metrics.max_error(label,predicted)...returnscore>>>forname,predictinpredicts.items():...models_score[name]=calculate_score(label,predict)...returnmodels_score>>>models=build_train_model()>>>result=maek_predict(models,X_val)>>>models_score=models_score(y_val,result)4.在9.4节的推荐系统中还有哪些特征可用于混合推荐系统?请根据设计基于这些特征的混合推荐系统并观察性能。数据集中共23项特征,可尝试选择合适的特征(如人气、语言、关键字等)进行推荐系统的设计,此处供读者自行设计验证。

第10章深度学习1.在第10.1.2节中所设计的卷积神经网络存在一定过拟合现象。请对数据集和网络模型进行进一步改进,以提升网络在验证数据集上的准确率。可以尝试在网络层中添加正则化(权重衰减),使用dropout技术,或对数据实行数据增强等增加模型的泛化能力,读者可自行尝试。2.在第10.2中的数据预处理使用了所有的文字作为训练数据,为节省内存开销,可在构建独热编码前将低频出现的词语去除。请实验去除文字比例和训练结果的关系。可以改造读取和处理数据的load_preprocess函数,增加一个参数pct,其值为0至1之间的浮点数,来控制要选取出现频率前百分之多少的词语,再进行模型的训练与验证,更改后的数据读取和预处理函数如下(以下代码仅供参考):>>>defload_and_preprocess(poem_path,end_char,pct=1.):...poems=[line.strip().replace('','').split(':')[1]forlineinopen(poem_path,encoding='utf-8')]...poem_list=[]#加上结束符号...forpoeminpoems:...iflen(poem)<=5:...continue...ifpoem[5]==",":...poem_list.append(poem+end_char)#数据集中的字符...character_list=[]...forpoeminpoem_list:...character_list+=[characterforcharacterinpoem]#排序,以防止每次ID不同...charact_dst={}...forcharincharacter_list:...charact_dst[char]=charact_dst.get(char,0)+1...char_pairs=sorted(charact_dst.items(),key=lambdax:x[1],reverse=True)...char_paris=char_pairs[:int(len(char_pairs)*pct)]...chars,counts=zip(*char_pairs)...char2num_dict={char:numfornum,charinenumerate(chars)}...num2char_dict={num:charfornum,charinenumerate(chars)}...char2num_func=lambdachar:char2num_dict.get(char,'')...poem_item=np.array([list(map(char2num_func,poem))forpoeminpoem_list],dtype=object)...returnpoem_item,char2num_dict,num2char_dict3.请根据10.2节中设计的诗歌生成器,设计预测函数,使其能够根据给定字符生成藏头诗。将案例中的pred函数进行修改,新增加一个txt参数,接受长度为4的字符串,作为藏头诗每句的开头,修改后代码如下(以下代码仅供参考):>>>defpredict_head(model,txt,input_data,char2num_dict,num2char_dict,unit_sentence):...txt_id=[]...foriintxt:...txt_id.append(char2num_dict[i])...char_size=len(char2num_dict)#随机取一首诗的开头6个字符,进行后面的预测...index=np.random.randint(0,len(input_data))...sentence=np.append(txt_id[0],input_data[index][1:unit_sentence])...def_pred(text):...temp=text[-unit_sentence:]...x_pred=np.zeros((1,unit_sentence,char_size))...fort,indexinenumerate(temp):...x_pred[0,t,index]=1...preds=model.predict(x_pred)[0]...choice_id=np.random.choice(range(len(preds)),1,p=preds)...ifnum2char_dict[choice_id[0]]=='':...whilenum2char_dict[choice_id[0]]in[',','。','']:...choice_id=np.random.randint(0,len(char2num_dict),1)...returnchoice_id...txt_index=1...foriinrange(24-unit_sentence):...pred=_pred(sentence)...ifiin[0,6,12]:...pred=txt_id[txt_index]...txt_index+=1...sentence=np.append(sentence,pred)...output=""...foriinrange(len(sentence)):...output=output+num2char_dict[sentence[i]]...print(output)随后加载模型进行测试>>>importos>>>importmatplotlib.pyplotasplt>>>importnumpyasnp>>>importtensorflowastf>>>fromtensorflow.keras.callbacksimportModelCheckpoint,TensorBoard,CSVLogger>>>fromtensorflow.keras.layersimportInput,LSTM,Dense,Dropout>>>fromtensorflow.keras.modelsimportModel>>>fromtensorflow.keras.optimizersimportAdam>>>defload_and_preprocess(poem_path,end_char):...poems=[line.strip().replace('','').split(':')[1]forlineinopen(poem_path,encoding='utf-8')]...poem_list=[]#加上结束符号...forpoeminpoems:...iflen(poem)<=5:...continue...ifpoem[5]==",":...poem_list.app

温馨提示

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

最新文档

评论

0/150

提交评论