刷 Python Crash Course 然后还有酒井暑培 AI Track

简单的自救以及#每日这里面看起来很好玩。

其实就是写了点刷书习题,然后暑培写了 AI Track 的大作业。水个字数。

前一半前言

实际上,先前我在清华上过的每一门 CS 课程都或者痛苦不堪,或者毫无收获。

第一学期上了郑莉老师的 C++ 程序设计基础选修课,从指针之后就开始加速冲,一节课链表一节课栈队列一节课模板一节课 IO 流一节课异常处理然后讲了些七零八碎的东西就上完了。我太菜了,指针之后就没跟上过,每周爆哭着写 OJ 题,写完就忘,摆烂到学期结束交了一个大作业,“优点是能跑,缺点是能跑的补集”。

老师表面反卷战士,不要求图形界面不要求炫酷功能,实际上助教评分把这些全评上了。拿 4.0 的都是来水绩点的佬,大作业答辩的时候我在众人中就像个垃圾桶,最后靠助教捞了一把才摸到一个 3.6。从此对所谓的“零基础”课程过敏,也对贵系课有了巨大恐惧,开始考虑转数而不是转码的事情。

第二学期为了完成培养方案,又重选了乔林老师的计程设,这培养方案什么都替代不了,烦死啦。也想重学一下 C(因为看到电子系室友就是这么学的,只是顺序反过来)。然后他又是讲到指针就结束了,我都会也就没听过课。花了半天了解了一下二者的语法差别和集中写完了七次随堂作业,又花了半天写了一个全是循环的 2048 大作业,再花一天(其实是在回家的高铁上)写完了大作业文档,最后莫名其妙就拿到了我的第一个 A+,普通工科的计算机课可真水啊

还有一门假装自己是数据库,实际上是会计技能速成的课,也是培养方案所迫。前半部分老师讲怎么用 Excel 和写 SQL,还算可以;后半部分助教讲的 Python 七零八碎,上课讲的和作业竟没有半点关系,每次写作业都又要爆哭到深夜,绷不住了还求助过社友。其实也没学会,但是完成作业就摸到了一个 A,莫名其妙。欺负文科生很有趣是吗

本来打算完整参加酒井暑培,结果被拔智齿、实习和随之而生的摸鱼之魂拖住了脚步。想着退而求其次,自己刷一遍蛇书,再听一下 AI Track。然后发现蛇书其实讲得相当不错,迅速解除了上学期在破数据库课上留下的心理阴影,理顺了很多历史遗留问题,学到许多。

后一半前言

上次学长问我为什么非要上抽代,我想了半天也只说出来万能理由“这里面看起来很有趣”,还有“假如之后转统计的话好像还是看起来有点数学背景比较好”。然后他问我多付出那么多时间学这个可能未来就没用了的东西值不值得,我说我不知道。他问我为什么要同时学基础拓扑学,我的理由还是上述两个,思来想去打算退掉了,想换一门稍微简单点的课(比如面向工科的 ODE)缓一缓,或许还能配合数值分析。任选一志愿白给了。数据结构即使是雷系的,一想起自己 C/C++ 的水平就很退缩,想给它退了换一门离散来上,等春季重选。还有一个多月就要回学校了,我连秋季上什么课都还没定好,有点麻。

(中间本来还有一大段,但发出来的版本里删掉了。)

书院最早的一批学生都还没到读研的时候,完全无从参考。院系里零字班的强者还相对多些,一字班见到的才过了一年基本就都在转出的路上半途而废了。(以偏概全警告)

搞不清楚。一想到这些,还有我本人的自闭性格,我就想把头塞进抽屉里先逃避一下,最多拿出初概的 PPT 先看一会,假装自己还是先去学了。

扯远了,这篇是在说看蛇书和暑培的事情。

先简单写亿个蛇书习题

取名鬼才警告,随手捏的信息不合实际警告,水字数警告。

基础

4-10 切片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#4-10 切片
list1 = [1,2,3,4,5,7,8]

print("first three:")
for number in list1[0:3]:
print(number)

length=len(list1)
location=length//2+1
print("middle three:")
for number in list1[location-2:location+1]:
print(number)

print("last three:")
for number in list1[-3:]:
print(number)

5-10 检查用户名

1
2
3
4
5
6
7
8
9
10
11
12
13
#5-10 检查用户名
current_users = ['neruko','Chiyuru','chiyuruuu','ouuan','pieris05']
new_users = ['Neruko','aliceZ','chiyuruuu','chiyuruu','TA']
#取名鬼才真的编不出来名字,谢谢社友们
current_users2=[user.lower() for user in current_users]

for users in new_users:
if users.lower() in current_users2:
print(f"The name {users} has been used!")
else:
print(f"You can use the name {users}")

print("Programme ended.")

6-8 宠物

1
2
3
4
5
6
7
8
9
10
11
12
#6-8 宠物
pet_01 = {'pet_type':'cat','owner':'Chiyuru'}
pet_02 = {'pet_type':'dog','owner':'ouuan'}
pet_03 = {'pet_type':'cat','owner':'Neruko'}
pets = [pet_01,pet_02,pet_03]

for pet in pets:
pettype = pet['pet_type']
ownername = pet['owner']
print(f"The {pettype}'s owner is {ownername}")

print("These are all the pets.")

6-9 喜欢的地方

1
2
3
4
5
6
7
8
9
10
#6-9 喜欢的地方
favorite_places = {'chiyuru':['Shanghai','London','Tokyo'],
'Neruko':['Beijing'],
'ouuan':['Beijing']}
#谢谢社友,其实只是写了北京(
for people in favorite_places.keys():
for city in favorite_places[people]:
print(f"{people} loves {city}.")

print("Programme ended.")

6-11 城市

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#6-11 城市
cities = {'Shanghai':{
'country':'China','pop':"2kw",'fact':'Best city in China'},
'London':{
'country':'Britain','pop':'1kw','fact':'Capital of Britain'},
'Tokyo':{
'country':'Japan','pop':'2kw','fact':'Heaven of ACGN'}} #这都是什么暴论

for city in cities.keys():
info = cities[city]
place = info['country']
people = info['pop']
description = info['fact']
print(f"{city} is in {place}. There're {people} people live here. Chiyuru describe it as {description}. ")

print("These are the cities.")

7-4 披萨配料

1
2
3
4
5
6
7
8
9
10
11
#7-4 披萨配料
toppings = ['pepper','chicken','ketchup']
for topping in toppings:
get = input(f"Please enter the addictive:{topping}\n")
if get == 'quit':
print("Thank you!")
break
elif get in toppings:
print(f"You've added {get}.")
else:
print("You've got the wrong recipe!")

7-5 电影票

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#7-5 电影票
count = 1
while count <= 1:
age = input("Please tell me your age:\n")
if int(age) < 3:
ticket = 0
print(f"Your ticket is {ticket} dollar.")
elif int(age) < 12:
ticket = 10
print(f"Your ticket is {ticket} dollars.")
elif int(age) > 12:
ticket = 15
print(f"Your ticket is {ticket} dollars.")
count = count + 1

7-8 熟食店

1
2
3
4
5
6
7
8
9
10
11
12
#7-8 熟食店
sandwich_orders = ['tuna', 'vegetable', 'ham', 'pastrami']
finished_sandwiches = []

while sandwich_orders:
order = sandwich_orders.pop()
finished_sandwiches.append(order)
print(f"I made your {order} sandwich.")

print("The finished sandwiches are:")
for order in finished_sandwiches:
print(f"{order} sandwich")

7-9 五香牛肉

1
2
3
4
5
6
7
8
9
10
11
12
#7-9 五香牛肉
sandwich_orders = ['pastrami','tuna','pastrami', 'vegetable', 'ham', 'pastrami']
finished_sandwiches = []

print("The pastrami has been sold out.")
while 'pastrami' in sandwich_orders:
sandwich_orders.remove('pastrami')

while sandwich_orders:
order = sandwich_orders.pop()
finished_sandwiches.append(order)
print(f"I made your {order} sandwich.")

8-5 大号T恤

1
2
3
4
5
6
#8-5 大号T恤
def make_shirt(size='L',word='I love Python'):
print(f"The T-shirt is {size} size with the sentence '{word}'.")
make_shirt()
make_shirt('M',)
make_shirt(word='I love C')

8-8 专辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#8-8 专辑
def make_album(singer,album):
infos = {'singer':singer,'album':album}
return infos
print(make_album('Hoshino Gen','Sun'))

flag = True
while flag:
singer = input("Please enter the name of the singer:")
if singer=='q':
flag = False
break
album = input("Please enter the name of the album:")
if album == 'q':
flag = False
break
print(make_album(singer,album))

print("The programme ended.")

8-11 发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#8-11 发送消息
msg = ['Hello!','Nice day!','Goodbye!']
def show_messages(messages):
for message in messages:
print(message)
show_messages(msg)

sent_msg = []
def send_messages(messages):
msg2 = messages[:]
while msg2:
message = msg2.pop()
print(f"Message '{message}' is sent.")
sent_msg.append(message)

send_messages(msg)
show_messages(msg)
show_messages(sent_msg)

8-14 汽车

1
2
3
4
5
6
7
8
#8-14 汽车
def save_car(builder,version,**carinfo):
carinfo['builder']=builder
carinfo['version']=version
return carinfo

print(save_car('Toyota','3',color='red'))
print(save_car('subaru','outback',color='blue',tow_package=True))

9-5 用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#9-5 用户
class User:
def __init__(self,firstName,lastName,notes,signature,login_attempts):
self.firstName=firstName
self.lastName=lastName
self.notes=notes
self.signature=signature
self.login_attempts=login_attempts

def describe_user(self):
print(f"The user's name is {self.firstName.title()} {self.lastName.title()}")
print(f"The user list the notes:{self.notes}.")
print(f"The user list the signature:{self.signature}.")

def greet_user(self):
print(f"Hello, {self.firstName.title()} {self.lastName.title()}!")

def increment_attempts(self):
self.login_attempts = self.login_attempts + 1
print(f"Your login attempts are {self.login_attempts}")

def reset_login_attempts(self):
self.login_attempts=0
print(f"Your login attempts is {self.login_attempts}")

Chiyuruu = User("Feiyan","Ma","QWQ","QWQWQ",12)
Chiyuruu.describe_user()
Chiyuruu.greet_user()
Chiyuruu.increment_attempts()
Chiyuruu.increment_attempts()
Chiyuruu.increment_attempts()
Chiyuruu.increment_attempts()
Chiyuruu.reset_login_attempts()

9-7 管理员

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#9-7 管理员
class User:
def __init__(self,firstName,lastName,notes,signature,login_attempts):
self.firstName=firstName
self.lastName=lastName
self.notes=notes
self.signature=signature
self.login_attempts=login_attempts

def describe_user(self):
print(f"The user's name is {self.firstName.title()} {self.lastName.title()}")
print(f"The user list the notes:{self.notes}.")
print(f"The user list the signature:{self.signature}.")

def greet_user(self):
print(f"Hello, {self.firstName.title()} {self.lastName.title()}!")

def increment_attempts(self):
self.login_attempts = self.login_attempts + 1
print(f"Your login attempts are {self.login_attempts}")

def reset_login_attempts(self):
self.login_attempts=0
print(f"Your login attempts is {self.login_attempts}")

class Admin(User):
def __init__(self,firstName,lastName,notes,signature,login_attempts,privileges = ['can add post','can delete post','can ban user']):
super().__init__(firstName, lastName, notes, signature, login_attempts)
self.privileges = privileges

def show_privileges(self):
for privilege in self.privileges:
print(f"The user is an Admin.He/She {privilege}.")

Chiyuru = Admin('Feiyan','Ma','QWQ','QWQWQ',114514,)
#非常巧,今天8.1,正好是我在闭社成为监察员的第一天。
Chiyuru.show_privileges()
Chiyuru.greet_user()
Chiyuru.describe_user()
Chiyuru.increment_attempts()
Chiyuru.reset_login_attempts()

9-8 权限(换一种方式写9-7)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#9-8 权限(换一种方式写9-7)
class Privileges:
def __init__(self,privileges = ['can add post','can delete post','can ban user']):
self.privileges = privileges

def show_privileges(self):
for privilege in self.privileges:
print(f"The user {privilege}.")

class User:
def __init__(self,firstName,lastName,notes,signature,login_attempts):
self.firstName=firstName
self.lastName=lastName
self.notes=notes
self.signature=signature
self.login_attempts=login_attempts

def describe_user(self):
print(f"The user's name is {self.firstName.title()} {self.lastName.title()}")
print(f"The user list the notes:{self.notes}.")
print(f"The user list the signature:{self.signature}.")

def greet_user(self):
print(f"Hello, {self.firstName.title()} {self.lastName.title()}!")

def increment_attempts(self):
self.login_attempts = self.login_attempts + 1
print(f"Your login attempts are {self.login_attempts}")

def reset_login_attempts(self):
self.login_attempts=0
print(f"Your login attempts is {self.login_attempts}")

class Admin(User):
def __init__(self,firstName,lastName,notes,signature,login_attempts):
super().__init__(firstName, lastName, notes, signature, login_attempts)
self.privileges = Privileges()

Chiyuru = Admin('Feiyan','Ma','QWQ','QWQWQ',114514)
Chiyuru.privileges.show_privileges()

9-14 彩票

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#9-14 彩票
from random import choice
ticket = ('1','2','3','4','5','6','7','8','9','0','A','B','C','D','E')

my_ticket = ['1','4','A','8']
time = 0
flag = False
while 1-flag:
time = time + 1
letter1 = choice(ticket)
letter2 = choice(ticket)
letter3 = choice(ticket)
letter4 = choice(ticket)
letters = [letter1,letter2,letter3,letter4]
flag = (my_ticket == letters)
print(letters)
print(f"We have guessed {time} times.")
print("The answer is correct!")

10-1 Python学习笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
#10-1 Python学习笔记
with open('pi.txt') as python_notes:
content = python_notes.read()
print(content)

with open('pi.txt') as python_notes:
content_lines = python_notes.readlines()

notes = ''
for line in content_lines:
print(line.strip())
notes = notes + line.strip()
print(notes)

10-2 C语言学习笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#10-2 C语言学习笔记
with open('pi.txt') as python_notes:
content = python_notes.read()
print(content.replace('Python','C'))

with open('pi.txt') as python_notes:
content_lines = python_notes.readlines()

notes = ''
for line in content_lines:
print(line.strip().replace('Python','C'))
notes = notes + line.strip()
print(notes.replace('Python','C'))

10-4 访客名单

1
2
3
4
5
6
7
8
#10-4 访客名单
guest = []
for i in range(0,5):
guest.append(input("Please enter the name of your guest:"))

with open('guest.txt','a') as guest_write:
for i in range(0,5):
guest_write.write(f'{guest[i]}\n')

10-5 调查

1
2
3
4
5
6
7
#10-5 调查
with open('reasons.txt','a') as reasons:
while True:
reason = input("Enter a reason why you love programming:")
if reason =='quit':
break
reasons.write(f"{reason}\n")

10-7 加法计算器

1
2
3
4
5
6
7
8
9
10
11
#10-7 加法计算器
while True:
try:
a = int(input("The first number:"))
b = int(input("The second number:"))
a+b
except ValueError:
print("You should try to enter a number")
else:
print(f"The answer is {a+b}.")
break

10-10 常见单词

1
2
3
4
5
6
7
8
9
10
11
12
13
#10-10 常见单词
count1 = 0
count2 = 0
count3 = 0
with open('alice.txt',encoding = 'utf-8') as alice:
content = alice.readlines()

for line in content:
count1 = count1 + line.lower().count('the')
count2 = count2 + line.lower().count(' the ')
count3 = count3 + line.lower().count('the ')

print(f"The results are {count1}, {count2} and {count3}.")

10-12 记住喜欢的数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#10-12 记住喜欢的数
import json

filename = 'lucky_number.json'

try:
with open(filename) as l_n:
lucky_number = json.load(l_n)
except FileNotFoundError:
print("You haven't told us your lucky number!")
number = input("Please enter your lucky number:")
with open(filename,'a') as l_n:
json.dump(number,l_n)
print("You have saved your lucky number!")

else:
print(f"Your lucky number is {lucky_number}.")

10-13 验证用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#10-13 验证用户
import json

def get_stored_username():

filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
return None
else:
return username

def get_new_username():

username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f:
json.dump(username, f)
return username

def greet_user():

username = get_stored_username()
if username:
judge = input(f"Is {username} your username?Please enter yes/no.")
if judge == 'yes':
print(f"Nice to see you,{username}!")
elif judge == 'no':
username = get_new_username()
print(f"We'll remember you when you come back, {username}!")

else:
username = get_new_username()
print(f"We'll remember you when you come back, {username}!")

greet_user()

数据可视化

插播:物理实验三件套

想起来确实有物理实验报告三件套:Python 画图,R 计算上位替代 Excel,LaTeX 水字数。

用来画表格记数据的 Excel:那我呢那我呢(

R-Script.R

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#不确定度。用的时候填充 data,修改其中的实验次数 “6”,根据情况修改已定系差和 B 类不确定度即可。
data = c(1,2,3,4,5,6)
d = mean(data) - 0.03 #均值减去已定系差
sd(d) #标准偏差
tinv = qt(0.975,6-1) #前者常数,后者自由度
U_A = tinv*sd(d)/sqrt(6)
U_B = 0.004 #B类不确定度,一般就是0
sqrt(U_A^2+U_B^2) #不确定度,一般就是U_A

#线性回归。用的时候修改 y 和 x 的值即可。
x = c(1,2,3,4,5,6)
y = c(3,4,5,6,2,9)
ans_1 = lm(y~x) #斜率不为零的拟合值
summary(ans_1) #显示具体值。其中Std.Error代表斜率截距A类不确定度
ans_2 = lm(y~x+0) #斜率为零的拟合值
summary(ans_2)

Template.tex

科协逼我写的 LaTeX 模板还没人 star:https://github.com/Chiyuru/THU-Fundamental-Physics-Report

然后甲方说你院会用 GitHub 的是少数,被逼在 Overleaf 上 Submit,竟然还过审了,人生污点喜加一:https://www.overleaf.com/latex/templates/qing-hua-da-xue-ji-chu-wu-li-shi-yan-bao-gao-mo-ban/bhmwsbdwnwwx

Python_Script.py

普通画个图用的,先不贴了(

15-5 随机漫步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from random import choice
import matplotlib.pyplot as plt

class RandomWalk:
def __init__(self, num_points = 50000):
self.num_points = num_points
self.x_values = [0]
self.y_values = [0]

def fill_walk(self):
while len(self.x_values) < self.num_points:
x_direction = choice([-1,1])
x_distance = choice([1,2,3,4,5])
x_length = x_direction * x_distance

y_direction = choice([-1,1])
y_distance = choice([1,2,3,4,0])
y_length = y_direction * y_distance

x_location = self.x_values[-1] + x_length
self.x_values.append(x_location)

y_location = self.y_values[-1] + y_length
self.y_values.append(y_location)

Ant = RandomWalk()
Ant.fill_walk()
point_number = range(0,50000)

fig,ax = plt.subplots()
ax.scatter(Ant.x_values,Ant.y_values,c=point_number,cmap=plt.cm.Blues,edgecolors='none')
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

plt.show()

这个好有趣哦,希望做云朵的胶带厂商学一下,多按几次随机漫步都比你们画的好看

image-20220803160953455

插曲:install plotly

是的没错,前面那个是插播,这个是插曲。

1
conda install plotly

Collecting package metadata (current_repodata.json): failed

愣了一下才反应过来又是被梯子背刺了,下次记得关(

15-6 交互式(?)掷骰子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from plotly import offline
from plotly.graph_objs import Bar,Layout
import random

class Dice:
def __init__(self, faces = 6):
self.faces = faces

def roll_dice(self):
result = random.randint(1,self.faces)
return result

dice = Dice()
results = []
frequency = [0,0,0,0,0,0]

for i in range(1,1001):
result = dice.roll_dice()
results.append(result)
print(results)

for result in results:
frequency[result-1] = frequency[result-1] + 1
print(frequency)

x_values = list(range(1,dice.faces+1))
data = [Bar(x=x_values,y=frequency)]
x_axis_config = {'title':'result','dtick':1}
y_axis_config = {'title':'frequency of the result'}
my_layout = Layout(xaxis = x_axis_config,yaxis = y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename = 'Dice.html')

15-8 点数相乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from plotly import offline
from plotly.graph_objs import Bar,Layout
import random

class Dice:
def __init__(self, faces):
self.faces = faces

def roll_dice(self):
result = random.randint(1,self.faces)
return result

dice1 = Dice(6)
dice2 = Dice(6)
results1 = [dice1.roll_dice() for i in range(1,1001)]
results2 = [dice2.roll_dice() for i in range(1,1001)]
results = [results1[i]*results2[i] for i in range(0,1000)]

frequencies = []

for value in range(1,37):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)

x_values = list(range(1,37))
data = [Bar(x=x_values,y=frequencies)]
x_axis_config = {'title':'result','dtick':1}
y_axis_config = {'title':'frequency of the result'}
my_layout = Layout(xaxis = x_axis_config,yaxis = y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename = '2Dice6.html')

16-1 希特卡的降雨量(梦回高考地理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = 'sitka_weather_2018_simple.csv'
with open(filename) as f:
content = csv.reader(f)
header_row = next(content)

rains = []
dates = []
for row in content:
rain = float(row[3])
date = datetime.strptime(row[2],'%Y-%m-%d')
rains.append(rain)
dates.append(date)

fig,ax = plt.subplots()
plt.style.use('seaborn')
ax.plot(dates,rains,c='red')
ax.set_ylabel('daily rain',fontsize=12)
ax.set_title('Daily Rain in Sitka')
fig.autofmt_xdate()

plt.show()

为什么要画单日降雨量呀,季度性的才有点用吧(?

image-20220803234204659

16-2 希特卡的日温差

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import csv
import matplotlib.pyplot as plt
from datetime import datetime

filename = 'sitka_weather_2018_simple.csv'
with open(filename) as f:
content = csv.reader(f)
header_row = next(content)

highs = []
lows = []
dates = []
for row in content:
high = int(row[5])
low = int(row[6])
date = datetime.strptime(row[2],'%Y-%m-%d')
highs.append(high)
lows.append(low)
dates.append(date)

fig,ax = plt.subplots()
plt.style.use('seaborn')
ax.plot(dates,highs,c='red')
ax.plot(dates,lows,c='blue')
ax.set_ylabel('Temperature',fontsize=12)
ax.set_title('Sitka Weather')
fig.autofmt_xdate()
ax.fill_between(dates,highs,lows,facecolor='blue',alpha=0.2)

plt.show()

image-20220803234934349

我的评价是,不如屑北京(x

16-6 咕咕咕

画地图结果地图的图层显示不出来,只有散点。血压高了,暂时没看出来哪里有问题。

太晚了,起来再研究。(咕咕咕

使用 API

记得关梯子记得关梯子记得关梯子(

17-1 其他语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import requests
from plotly import offline

url = 'https://api.github.com/search/repositories?q=language:c&sort=stars'
headers = {'Accept': 'application/vnd.github.v3+json'}
r = requests.get(url, headers=headers)
response_dict = r.json()

repo_list = response_dict['items']
repo_names,stars,labels,repo_links =[],[],[],[]
for repo in repo_list:
name = repo['name']
star = repo['stargazers_count']
owner = repo['owner']['login']
description = repo['description']
label = f"{owner}<br />{description}"
repo_url = repo['html_url']
repo_link = f"<a href='{repo_url}'>{name}</a>"

repo_links.append(repo_link)
labels.append(label)
repo_names.append(name)
stars.append(star)

data = [{'type':'bar','x':repo_links,'y':stars,'hovertext': labels,
'marker': {'color': 'rgb(60, 100, 150)','line': {'width': 1.5, 'color': 'rgb(25, 25, 25)'}
},'opacity': 0.6,}]
my_layout = {'title':'Most Popular C Repos on Github',
'xaxis':{'title':'Repos'},'yaxis':{'title':'Stars'},}
fig = {'data':data,'layout':my_layout}
offline.plot(fig,filename = 'c_repos.html')

Django 与 Web 应用程序

这个书上就给了个实例,我就跟着操作了一遍所以也并没有学会。不过也不是刚需,酒井暑培那边也没去听这个部分,虽然看起来很炫酷很适合给我这种业余玩家炫技

酒井暑培 AI Track 大作业

大作业 Repo:https://github.com/c7w/sast2022-pytorch-training

近一个月后才开始做这份作业,多少是因为一开始基础和时间安排都没能跟上进度。完成之后这个暑假就没什么 coding 的任务了,安心摸鱼看数学去。

Subtask 0 环境配置与安装

准备 Python 环境(10 p.t.s)

我们在前面的课程已经学习过 conda 环境管理器的使用,你应该可以理解下面指令的作用。

1
2
3
conda create -n ai python=3.8
conda activate ai
pip install -r requirements.txt

如果你是 NVIDIA 显卡的受害者,那么恭喜你可以使用 CUDA 加速的相关库。你可以理解成充分利用你的显卡的算力来做并行计算。如果你有一张显存大于 4 GB 的显卡就非常符合本次任务的要求:请删除 requirements.txttorch==1.12.0 这一行,然后安装带有 CUDA 加速版本的 torch

1
2
3
4
# Windows / Linux
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
# macOS is not supported yet for CUDA :(
# Link copied from https://pytorch.org/

准备数据集(5 p.t.s)

请从上面清华云盘的链接中下载数据集,然后解压到 data 目录下,保证 data 目录下直接存在 trainvaltest 文件夹与 LICENSE 文件。

请阅读 LICENSE 文件,继续进行本作业代表你已知晓并同意 LICENSE 文件中的所有内容。

其实这一步我就 fail 了,因为电脑显卡是 A 卡,不是 N 卡,用不了 CUDA。

所以还出门请亲友吃了个饭然后抢电脑跑数据(

另外不知道为什么装 CPUonly 的 PyTorch 也装不上,换了无数个源了也不行。然后随便试了一下装 icecream 都可以。我迟早要把这个破 Anaconda 卸了然后重装一遍 VScode 实在不行重装 C 盘也行(暴言

Subtask 1 数据预处理

在这一部分我们需要撰写数据预处理的相关函数,你可能会用到 PillowNumPy 等库。

具体来说,我们需要统计 trainimgs 下图片对应的分类标签。imgs 中图片的逐像素标注位于 train/labels 下,你可以将每张图片认为是一张灰度图,存储了 0-255 这 256 个数的其中之一。标签 ID 与标签的对应关系如下:

标签 ID 标签类别
0, 7 Mountain
1 Sky
2, 3, 8, 16, 20 Water

也就是说,对于一张图片,我们要判断其中有没有山、有没有天空、有没有水,以此来实现对图片打“标签”的效果。接下来我们便要对这些图片及其标签进行预处理,其步骤为:

对于一张图片,如果其中标记为 “Mountain” 像素的个数超过了总像素的 20%,我们就认为这张图片中含有 “Mountain”。同理,如果一张图片中标记为 “Sky”、“Water”、“Human Factor” 的像素个数超过了总像素个数的 20%,我们就认为这张图片中含有 “Sky”、“Water”、“Human Factor”。

数据预处理(45 p.t.s)

接下来请阅读并补全 datasets/dataset_landscape_generator.py 中的代码,以达到可以产生与 data/val/file.txt 相类似的 data/train/file.txt 的效果。为达成目标,你只需要修改 # TODO Start ## TODO End # 之间的内容。

在你完成这部分后,你应该在 ./data/train 下生成了一个 file.txt 文件。你可以与这个文件作对比以查看中间结果是否正确。

【任务清单】

  • 阅读 data/val/file.txt,了解我们要处理成的目标数据格式(5 p.t.s)
  • process_data 函数中:(20 p.t.s)
    • 构建 image_dirlabel_dirpathlib.Path
    • 构建 filename_listos.listdir,对字符串切片取消后缀名)
    • 将处理后的字符串写入 {working_dir}/file.txt (写入文件)
  • calc_label 函数中:(20 p.t.s)
    • 按照函数注释中的内容完成函数
    • 正确的做法预处理 train 数据集中的数据应该在 10 min 以内完成
    • 提示:将 label 视为传统的二维数组进行遍历需要至少 1024 \(\times\) 768 次计算,而这在 8000 张图片上运行会导致处理效率的降低
    • 提示:能否借助 NumPy 中的工具进行高效并行计算?
    • 提示:np.isinnp.sum

打开 train/labels哇塞都好黑啊

打开 datasets/dataset_landscape_generator.py 研究了亿下,总之就是填四个函数,注释给得已经很清楚了。一个是利用 NumPy 打标签,写了半天循环才想起来可以直接使用表达式的值。然后没理解错的话就是写个路径,存所有图片的文件名,然后把标签结果的 .txt 输出到 data/imgs里去。

大概看懂了思路是什么,不需要自己写的地方的具体实现有的还是不太明白。不过程序跑出来的时候还是有点又惊讶又激动的,原来我也可以做到的吗XD。(站在巨人的肩膀上XD(这还只是个开始

wowow

Subtask 2 及以后

Repo 上的最新代码是已经填好大部分的版本,部分地方微调了一下。然后就是疯狂读文档试图理解他在干什么,虽然也没全懂...。

但是因为显卡的问题,所以都是在友人的电脑上完成的,也不写啥了。

提交结果

image-20220809161338510

唔...因为很怂所以甚至没有用自己的学号提交...本来想用 2021114514 的,但是怎么偏偏 ban 了这个啊!

image-20220809161456569

交上去之后一想,好像确实也有用这个学号的人,再一查正好是同一个院系里的,啊这。那就让你赚点暑培奖励吧

虽然是满分(因为平均过 0.80 了),但因为 Mountain 实在偏低所以没过 Strong Baseline。自己的设备不合适也没什么机会再调了,要么下次再把友人骗出来一次 = =。

后记

在考虑再试一次,然后用自己的学号提交...为什么总是在这些事情上这么自卑呢 = =

虽然理论水平不行,但是能跑出个结果倒是还挺好玩。

显卡要熟了

反正不是我自己的

后记再后记

又修了一天电脑,然后把 Anaconda 卸了,皈依 VSCode 神教。怀疑之前怎么换源都装不上 PyTorch 是因为 Anaconda 污染路径,其实类似问题还蛮多的,感觉很难解决,没必要。

大概就是拎包入住的公寓和需要自己装修的房子的区别吧。

今天又试着调了参,分数怎么比原来更低了(乐

还是没能以自己的名义交上去,做不到。

最后的后记

仓促之中调整的还是不够,所以想试着在自己的电脑上用 A 卡跑出来。

所以巧合之下发现原来的 main.py 还写错了一个地方,是不是觉得没有人会真的用 A 卡或者 Mac 跑这个x

1
2
3
4
5
6
7
# main.py
if __name__ == '__main__':
--snip--
parser.add_argument('--device',type=int,default=0 \
if torch.cuda.is_available() \
else "cpu",help='Device number.')
# correct: else torch.device("cpu")

然后真的是结结实实地跑了十轮,十个小时。从早晨跑到晚上。这一天就当做给自己放假了,坐在电脑旁边读了一直想读的两本书,一本是毛姆的《面纱》,一本是钱穆的《中国历代政治得失》。

不插电源的话一张图跑 5~6s,插电只要 3.5s 左右。一开始没插电源,电量下去之后一度飙到了 6.5s,有点吓到。

最后还是没能过 Strong Baseline,数据其实也没有之前那一次的好,但是用自己的学号提交了。人类是有极限的 A 卡是有极限的,一轮一小时的话实在是跑不动,所以就先这样了。

一些奇怪的散热方式:

image-20220812234902021

下面垫的是数值分析和抽代的书(

image-20220812234916346

鸠占鹊巢,于是我坐在了地上(

刚在原仓库下提交了 Issue,总感觉对方好像没意识到问题其实只是在于,这个值应该是 int 而不是str而已(。不过也不太会有人用 CPU 硬跑了,就这样吧。

image-20220812234512664

总之完结撒花!

我很可爱 请给我钱(?)

欢迎关注我的其它发布渠道