首页 飞桨领航团 帖子详情
【AI达人养成营】学习心得
收藏
快速回复
飞桨领航团 文章AI达人创造营 1083 0
【AI达人养成营】学习心得
收藏
快速回复
飞桨领航团 文章AI达人创造营 1083 0

作业部分
作业1 Python 基础
输入输出学习
输入两个整数,并计算二者的加减乘除的结果

a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
​
# 分别把 a、b 转换成整数
a=int(a)
b=int(b)
​
# 计算 a、b 的和、差、积、商,赋值给变量c,并打印
c=a+b
print("和:c = %d"%c)
c=a-b
print("差:c = %d"%c)
c=a*b
print("积:c = %d"%c)
c=a/b
print("商:c = %d"%c)


条件判断
输入两个整数,如果两个整数之和小于100,则输出 '小于100',否则输出 '不小于100'

a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
​
# 分别把 a、b 转换成整数
a=int(a)
b=int(b)
# 计算 a、b 的和,赋值给变量c
c=a+b
​
# 判断c是否小于100,按要求输出
if c < 100:
   print("小于100")
else:
   print("不小于100")


3.列表学习(数组)

1.创建一个含有元素1,2,4,8,16,32的列表

尽可能的写多种的方法实现(两种以上该问满分)

2.分别完成以下操作(在原列表基础上)

· 输出第2个元素 · 删除第2个元素 · 更改第2个元素为0

# 列表统一命名为L
# 方法一:
L = [1,2,4,8,16,32]
print(L)
# 方法二:
L =[]
for i in range(6):
   a=pow(2,i)
   L.append(a)
print(L)
​
#输出第2个元素
print(L[1])
#删除第2个元素
print('未删除前')
print(L)
print('删除后')
L.pop(1)
print(L)
#更改第2个元素为0
print('更改第2个元素为0')
L[1]=0
print(L)


斐波那契数列
资源限制

时间限制:1.0s 内存限制:256.0MB

想要拿满分的话,资源限制一定要特别注意!

问题描述

Fibonacci数列的递推公式为:FnF_nF**n = F(n−1)F(n−1)F(n−1) + F(n−2)F(n−2)F(n−2) 其中F1F_1F1=F2F_{2}F2 = 1

当n比较大时,FnF_nF**n也非常大,现在我们想知道,FnF_nF**n除以10007的余数是多少。

输入格式

输入包含一个整数n。

输出格式

输出一行,包含一个整数,表示Fn除以10007的余数。

 

解题思路

先找出对10007取余的循环节,通过暴力跑斐波那契数列,我们可以知道每20016个数结果循环一次,所以我们可以先对n进行取余 然后再看看对应的Fn是多少。

n = int(input())
#寻找循环节
L=[0,1,1]
for i in range(3,20019):
   a=(L[i-1]%10007)+(L[i-2]%10007)
   a%=10007
   L.append(a)
#每20016个数循环一次,可以先用代码暴力跑出来这个数字
n%=20016
result=L[n]
print(result)

 

作业2 Python数据排序
对随机生成并且打乱的arr从小到大依次进行冒泡排序,快速排序,插入排序和希尔排序算法

1.冒泡排序算法

冒泡排序算法就是每次遍历比较相邻两个数,遍历n-1次后就排序完成了。

# 随机生成
import numpy as np
​
#请把冒泡排序算法补充完整
#每次比较相邻两个数
def bubble_sort(nums):
   n=len(nums)
   for i in range(n):
       for j in range(n-i-1):
           if nums[j] > nums[j+1]:
               temp=nums[j]
               nums[j]=nums[j+1]
               nums[j+1]=temp
   return nums
if __name__ == '__main__':
   # 打乱顺序并随机生成
   nums=np.random.permutation(20)
   print('没排序前')
   print(nums)
   print('排序后')
   print(bubble_sort(nums))

 

2.快速排序算法

每次循环先根据最后一个数把数组分成两部分:小于这个数的A数组和大于这个数的B数组。当我们找到最后一个数应该所在的位置后,这个数就固定位置了。

这之后,我们对两部分数组重复这个操作。

# 随机生成
import numpy as np
​
#请把快速排序算法补充完整
#把比数组每部分最后一位小的往前移,大的往后放
def partition(arr, l,r):
   i=l-1
   p=arr[r]
   for j in range(l,r):
       if arr[j] < p:
           i+=1
           arr[i],arr[j]=arr[j],arr[i]
   arr[i+1],arr[r]=arr[r],arr[i+1]
   return (i+1)
def quickSort(arr,l,r):
   if(l

 

3.希尔排序

希尔排序是指先设定一个距离值,初始为n/2。每次遍历把距离相同距离的几个数排好序,然后把距离值/2。然后重复这个操作。

中间移动过程是用插入排序思路。

# 随机生成
import numpy as np
​
#请把希尔排序算法补充完整
def shellSort(arr):
   n=len(arr)
   gap=int(n/2)
   while gap >0:
       for i in range(gap,n):
           temp=arr[i]
           j=i
           while j>=gap and arr[j-gap]>temp:
               arr[j]=arr[j-gap]
               j-=gap
           arr[j]=temp
       gap=int(gap/2)
   return arr
if __name__ == '__main__':
   
   nums=np.random.permutation(20)
   print('没排序前')
   print(nums)
   print('排序后')
   print(shellSort(nums))

4.插入排序

插入排序就是把当前的数插入到前面已经排好序的数组里。我们可以假设第一个数就是已经排好序的。然后把比当前数大的往后移,直到找到当前数应该在的位置,每次保持序列有序。

# 随机生成
import numpy as np
​
#请把插入排序算法补充完整
#每次先把比当前大的值往后移,直到第一个比自己小的。
def insertionSort(arr):
   n=len(arr)
   for i in range(1,n):
       if arr[i]>arr[i-1]:
           continue
       else:
           temp=arr[i]
           k=i-1
           while arr[k]>temp and k>=0:
               arr[k+1]=arr[k]
               k-=1
           arr[k]=temp
   return arr
if __name__ == '__main__':
   nums=np.random.permutation(20)
   print('没排序前')
   print(nums)
   print('排序后')
   print(bubble_sort(nums))

 

作业3:大作业
1.第1题

数据如下:

stu1.txt 孙同学,2020-5-21,20,'男',77,56,77,76,92,58,-91,84,69,-91
stu2.txt 赵同学,2020-11-3,24,'女',65,68,72,95,-81,71,86,91,57,91
stu3.txt 王同学,2021-8-7,25,'男',87,78,90,-76,88,47,100,65,69,100
stu4.txt 李同学,2021-8-10,29,'男',92,54,85,71,-91,68,77,68,95,95
以上四个txt文档在work路径下可以找到。

定义Student类,包括name、dob、age、gender和score属性,包括top3方法用来返回学生的最大的3个成绩(可重复)、sanitize方法用来将负的分数变为正的分数,负的分数可能是输入错误。声明stu_list对象组数用于存储所有的学生对象。最后输出所有的学生信息包括姓名、生日、年龄、性别、最高的3个分数。

第一题的输出结果如下,供参考:

 

解题思路

先创建一个学生类

class 学生:

初始化:对每个学生对象初始化赋值name、dob、age、gender和score值。

top3函数:返回学生的最大的3个成绩(可重复)

sanitize函数:sanitize方法用来将负的分数变为正的分数

我们观察文件,可以发现除了中间数不一样以外,其他文件名格式都是一样的。所以我们可以用循环来读取这4个文件。

打开txt文件和每行读取方法在朱子英老师讲解的项目中有,可以参考一下。

读取完后,我的思路是把score值提前先转化为整数类型的值。

可以试试对字符类型的值把前面的负号去掉。

之后再存到stu_list对象数组里。

class Student:
   def __init__(self,a_name,a_birth,a_age,a_sex,a_scores=[]):
       self.name=a_name
       self.birth=a_birth
       self.age=a_age
       self.sex=a_sex
       self.scores=a_scores
   def top3(self):
       return sorted([self.sanitize(t) for t in self.scores])[-4:-1]
   def sanitize(self,num):
       if num < 0 :
           num=-1*num
       return num
#使用一个数组来进行存储对象
stu_list=[]
# 将文件打开,按每行读入,分别使用,隔开
def get_coach_data(filename):
   with open (filename) as f:
       line = f.readline()
   return line.strip().split(',')
# 提前把字符类型的数字转化为整数型的数字,方便后面处理
def trans(times=[]):
   num=[]
   l=len(times)
   for i in range(l):
       num.append(int(times[i]))
   return num
#利用循环来创建对象
for i in range(1,5):
   filename='work/stu'+str(i)+'.txt'
   time=get_coach_data(filename)
   stu_name=time.pop(0)
   stu_birth=time.pop(0)
   stu_age=time.pop(0)
   stu_sex=time.pop(0)
   stu_scores=trans(time)
   stude=Student(stu_name,stu_birth,stu_age,stu_sex,stu_scores)
   stu_list.append(stude)
for i in range(0,4):
   print(f"姓名:{stu_list[i].name} 生日:{stu_list[i].birth} 年龄:{stu_list[i].age} 性别:{stu_list[i].sex} 分数:{stu_list[i].top3()} ")


 

2.第2题

数据格式如下:

stu5.txt 特长同学,2020-10-5,20,'男',180,87,98,77,76,92,58,-76,84,69,-47
stu6.txt 特长同学,2020-10-6,20,'女',230,76,48,82,88,92,58,-91,84,69,-68
以上两个txt文档在work路径下可以找到。

定义Spostudent、Artstudent为Student的子类,在子类的属性里面新增了spe为特长分数。Spostudent包括的top3方法返回的是最低的3个得分(可重复),Artstudent包括top3方法返回的是最高的3个得分(可重复),最后使用多态的方式输出2个特长同学的姓名、生日、年龄、性别、分数、特长分。

第二题的输出结果如下,供参考:

 

解题思路

先把Spostudent、Artstudent定义好,然后用循环分别创建两个对象,还是存在对象数组里。然后一起输出。

有一个点需要注意的是:

当我们定义Spostudent类的时候,特长分要放在分数值前面。因为分数值是一个缺失值,所以在初始化的时候,我们要把特长分放在分数值前面。并且在继承初始化的时候,我们不能写a_scores=[],这样的话相当于每次创建对象,都是把空数组赋值给对象的分数值。

#spe要放在scores前面
#定义Spostudent类
class Spostudent(Student):
   def __init__(self,a_name,a_birth,a_age,a_sex,a_spe,a_scores=[]):
       #继承的时候不能写等于=[] 因为这样的话就不能把输入的数值给读入。只能赋予一个空的数组。
       super().__init__(a_name,a_birth,a_age,a_sex,a_scores)
       self.spe=a_spe
   def top3(self):
       return sorted([self.sanitize(t) for t in self.scores])[0:3]
#定义Artstudent类
class Artstudent(Student):
   def __init__(self,a_name,a_birth,a_age,a_sex,a_spe,a_scores=[]):
       super().__init__(a_name,a_birth,a_age,a_sex,a_scores)
       self.spe=a_spe
#使用一个数组来进行存储对象
stu_list=[]
# 将文件打开,按每行读入,分别使用,隔开
def get_coach_data(filename):
   with open (filename) as f:
       line = f.readline()
   return line.strip().split(',')
# 提前把字符类型的数字转化为整数型的数字,方便后面处理
def trans(times=[]):
   num=[]
   l=len(times)
   for i in range(l):
       num.append(int(times[i]))
   return num
#数据文件为stu5.txt 和 stu6.txt
for i in range(5,7):
   filename='work/stu'+str(i)+'.txt'
   time=get_coach_data(filename)
   stu_name=time.pop(0)
   stu_birth=time.pop(0)
   stu_age=time.pop(0)
   stu_sex=time.pop(0)
   stu_spe=time.pop(0)
   stu_scores=trans(time)
   #不同类使用不同定义方式
   if i == 5:
       stude=Spostudent(stu_name,stu_birth,stu_age,stu_sex,stu_spe,stu_scores)
   else:
       stude=Artstudent(stu_name,stu_birth,stu_age,stu_sex,stu_spe,stu_scores)
   stu_list.append(stude)
for i in range(0,2):
   print(f"姓名:{stu_list[i].name} 生日:{stu_list[i].birth} 年龄:{stu_list[i].age} 性别:{stu_list[i].sex} 分数:{stu_list[i].top3()} 特长分:{stu_list[i].spe}")


 

作业3:图像处理

1、图像翻转 按照以下条件翻转图像

水平翻转
竖直翻转 保存的文件名为1-1.png和1-2.png(也可以输出图片)
使用cv2.flip函数来实现。第二个参数,

如果是等于0就是垂直翻转,

大于0就是水平翻转,

小于0就是水平垂直翻转。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
​
path = "baidu_bear.png" # 图片路径
image = Image.open(path)
image = np.array(image)
#在下面补充相关代码
#转换为RGB通道存储
def cv2_cvtColor(dst):
   return cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
# 水平翻转
dst = cv2.flip(image,1)
# 垂直翻转
dst1 = cv2.flip(image, 0)
dst = cv2_cvtColor(dst)
dst1 = cv2_cvtColor(dst1)
#存储
cv2.imwrite('1-1.png',dst)
cv2.imwrite('1-2.png',dst1)

 

2、图像裁剪 按照以下条件裁剪图像

长度方向
宽度方向
俩个方向同时裁剪
随机裁剪的图片(大小设定随意) 保存的文件名为2-1.png、2-2.png、2-3.png、2-4.png(也可以输出图片)
使用image.crop这个函数实现,四个参数分别对应左、上、右、下。对应的是左上角的坐标系。

随机裁剪这块,生成两个数,然后在这两个数的基础上,分别都加100,生成剩下两个数。同时保证这四个数都是在图片大小范围内。不满足就重新生成。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
print(image.size)
#wide high 580,435
#长度方向裁剪
k1 = image.crop((0,0, 580, 200))
k1.save("2-1.png")
#宽度方向裁剪
k2 = image.crop((0,0,200, 435 ))
k2.save("2-2.png")
#俩个方向同时裁剪
k3 = image.crop((0,0,200, 200 ))
k3.save("2-3.png")
# 随机裁剪的图片(大小设定随意)
#随机生成2个数,保持图片大小为100*100
import random
def num_round():
    left1=random.randint(0,580)
    right1=left1+100
    up1=random.randint(0,435)
    lower1=up1+100
    return left1, up1, right1, lower1
left1=right1=589
up1=lower1=540
#如果随机生成的数超出图片边界的话,就重新生成
while (left1<0 or left1 >580 or right1<0 or right1>580 or up1<0 or up1>435 or lower1<0 or lower1>435):
    left1,up1,right1,lower1=num_round()
# print(left1,up1,right1,lower1)
k4 = image.crop((left1,up1,right1,lower1 ))
k4.save("2-4.png")
# 看看图片大小
# image = Image.open("2-4.png")
# print(image.size)


 

3、图像亮度变换

按照以下要求调整图像亮度

一半亮度
两倍亮度 保存的文件名为3-1.png、3-2.png(也可以输出图片)
PIL模块中的ImageEnhance进行图片数据增强,只能用于 1.Brightness 亮度 2.Color 色度 3.Contrast 对比度 4.Sharpness 锐度

使用方法:

enh_sha = ImageEnhance.XX(image)

sharpness = 0.8

image_changed= enh_sha.enhance(sharpness)

cv2.imwrite('1-1.png',image_changed)

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#能调整图像的亮度、对比度、色度、锐度
from PIL import ImageEnhance
path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
#亮度增强
def changeimage(x):
    enh_bri = ImageEnhance.Brightness(image)
    brightness = x
    image_brightened = enh_bri.enhance(brightness)
    return image_brightened
k1=changeimage(0.5)   #调暗
k2=changeimage(2)  #调亮
k1.save("3-1.png")
k2.save("3-2.png")


 

4、图像色调变换

按照以下要求调整图像色调

色调取反
转成灰度图
对灰度图色调取反
增强饱和度

保存的文件名为4-1.png、4-2.png、4-3.png、4-4.png(也可以输出图片)
色调取反,就是对每个通道,拿最大值(这里是2^8-1=256-1)减去每个通道的值。

灰度图可以使用cv2.cvtColor这个函数进行转换,灰度图只有一个通道,所以可以直接拿255-灰度图实现对灰度图的色调取反。

一.对比度和饱和度的区别

对比度指的是最高亮度和最低亮度的比值。当图像对比度越高时,说明图像明暗差异越明显; 饱和度指的是色彩的纯正程度,越纯正饱和度越高。如纯蓝、纯红、纯绿属于高饱和度,而灰蓝、玫红、草绿属于低饱和度,因此图像的饱和度越高说明图像色彩越鲜艳。 先从RGB转化为HSV HSV分别为色调,饱和度,亮度。 然后单独对S层进行调整。

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
path = "baidu_bear.png" # 图片路径
image = Image.open(path) #读取图片
image = np.array(image)
#色调取反
sha=image.shape
height,width,deep=sha
#(435, 580, 3)
# print(sha)
dst=np.zeros((height,width,3),np.uint8)
for i in range(height):
    for j in range(width):
        b,g,r=image[i][j]
        dst[i][j]=(255-b,255-g,255-r)
cv2.imwrite('4-1.png',dst)

#转成灰度图
gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite('4-2.png',gray)

#对灰度图色调取反
k2=255-gray
cv2.imwrite('4-3.png',k2)

#增强饱和度
#先从RGB转化为HSV HSV分别为色调,饱和度,亮度
hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
#分离三个矩阵
h,s,v=cv2.split(hsv)
#饱和度调节参数
k=1
s=s*k
#合并
hsv=cv2.merge([h,s,v])
#重新转化为RGB
image=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imwrite('4-4.png',image)


还有另一种实现调整图像饱和度的做法---PS 图像调整中的饱和度调整算法

但是网上找的资料还是有些错误。我也没弄明白原理,所以暂时不贴出来。

 

 

 

 

0
收藏
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户