《Python编程:从入门到实践》第15章-生成数据习题

更新时间:2023-05-27 15:51:14 阅读: 评论:0

春天里有什么花-护士业务学习

《Python编程:从入门到实践》第15章-生成数据习题
2023年5月27日发(作者:纪维克)

Python编程:从⼊门到实践》第15-⽣成数据习题

开⼼~开始学习数据可视化啦

⽂章⽬录

15-1 ⽴⽅

数字的三次⽅被称为其⽴⽅。请绘制⼀个图形,显⽰前5个整数的⽴⽅值,再绘制⼀个图形,显⽰前5000个整数的⽴⽅值。

import matplotlib.pyplot as plt

#1-5000

创建的整数列表

x_values = list(range(1,5001))

y_values = [x**3 for x in x_values]

plt.scatter(x_values, y_values, edgecolor='none', s=20)

#

设置图标标题并给坐标轴指定标签

plt.title("Cube Numbers")

plt.xlabel("Value", fontsize=24)

plt.ylabel("Cube of Value", fontsize=14)

#

设置刻度标记的⼤⼩

plt.tick_params(axis='both', which='major', labelsize=14)

plt.show()

build

15-2 彩⾊⽴⽅

给你前⾯绘制的⽴⽅图指定颜⾊映射

import matplotlib.pyplot as plt

#1-5000

创建的整数列表

x_values = list(range(1,5001))

y_values = [x**3 for x in x_values]

plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Reds, edgecolor='none', s=20)

#

设置图标标题并给坐标轴指定标签

-snip

#

设置刻度标记的⼤⼩

-snip-

#

设置每个坐标轴的取值范围

-snip-

plt.show()

这⾥尝试了⼀下cmap= 红⾊的颜⾊映射

build

15-3 分⼦运动

修改rw_,将其中的r()替换为()。为模拟花粉在⽔滴表⾯的运动路径,向()传递rw.x_values和

rw.y_values,并指定实参值linewidth。使⽤5000个点⽽不是50000个点。

import matplotlib.pyplot as plt

from random_walk import RandomWalk

#

只要程序处于活动状态,就不断地模拟随机漫步

while True:

#RandomWalk

创建⼀个实例,并将其包含的点都绘制出来。

#5000

使⽤个点

rw = RandomWalk()

rw.fill_walk()

#

设置绘图窗⼝的尺⼨

plt.figure(dpi=96, figsize=(10,6))

# ()

来模拟花粉在⽔滴表⾯的运动路径。

#

设置绘制线条的粗细。

plt.plot(rw.x_values, rw.y_values, linewidth=1)

plt.scatter(0, 0, c='green', edgecolor='none', s=100)

plt.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolor='none', s=100)

#

隐藏坐标轴

plt.axes().get_xaxis().t_visible(Fal)

plt.axes().get_yaxis().t_visible(Fal)

plt.show()

keep_running = input("Make another walk? (y/n): ")

if keep_running == 'n':

break

Line17为主要变化的代码

build

15-4 改进的随机漫步

在类RandomWalk中,x_step和y_step是根据相同的条件⽣成的:从列表[-1, 1]中随机地选择⽅向,并从列表[0, 1, 2, 3, 4]中随机地选

择距离。请修改这些列表中的值,看看对随机漫步路径有何影响。尝试使⽤更长的距离选择列表,如0~8;或者将-1从 ⽅向列表中

xy

删除。

(1)使⽤更长的距离选择列表:

from random import choice

class RandomWalk():

"""⼀个⽣成随机漫步数据的类"""

def __init__(lf, num_points=5000):

"""初始化随机漫步的属性"""

lf.num_points = num_points

#(0, 0)

所有随机漫步都始于

lf.x_values = [0]

lf.y_values = [0]

def fill_walk(lf):

"""计算随机漫步包含的所有点"""

#

不断漫步,直到列表达到指定的长度

while len(lf.x_values) < lf.num_points:

#

决定前进⽅向以及沿这个⽅向前进的距离

x_direction = choice([1, -1])

x_distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8])

x_step = x_direction * x_distance

y_direction = choice([1,-1])

y_distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8])

y_step = y_direction * y_distance

#

拒绝原地踏步

if x_step == 0 and y_step == 0:

continue

# xy

计算下⼀个点的值和

next_x = lf.x_values[-1] + x_step

next_y = lf.y_values[-1] + y_step

lf.x_values.append(next_x)

lf.y_values.append(next_y)

将-1从 ⽅向删除

xy

变化还是蛮⼤的。

15-5 重构

⽅法fill_walk()很长。请新建⼀个名为get_step()的⽅法,⽤于确定每次漫步的距离和⽅向,并计算这次漫步将如何移动。然后,在

fill_walk()中调⽤get_step()两次:

x_step = _step()

y_step = _step()

通过这样的重构,可缩⼩fill_walk()的规模,让这个⽅法阅读和理解起来更容易。

from random import choice

class RandomWalk():

"""⼀个⽣成随机漫步数据的类"""

def __init__(lf, num_points=5000):

"""初始化随机漫步的属性"""

lf.num_points = num_points

#(0, 0)

所有随机漫步都始于

lf.x_values = [0]

lf.y_values = [0]

def get_step(lf):

"""确定每次漫步的距离和⽅向,并计算这次漫步将如何移动"""

#

决定前进⽅向以及沿这个⽅向前进的距离

x_direction = choice([1, -1])

x_distance = choice([0, 1, 2, 3, 4])

x_step = x_direction * x_distance

y_direction = choice([1, -1])

y_distance = choice([0, 1, 2, 3, 4])

y_step = y_direction * y_distance

return x_step

return y_step

def fill_walk(lf):

"""计算随机漫步包含的所有点"""

#

不断漫步,直到列表达到指定的长度

while len(lf.x_values) < lf.num_points:

x_step = lf.get_step()

y_step = lf.get_step()

#

拒绝原地踏步

if x_step == 0 and y_step == 0:

continue

# xy

计算下⼀个点的值和

next_x = lf.x_values[-1] + x_step

next_y = lf.y_values[-1] + y_step

lf.x_values.append(next_x)

lf.y_values.append(next_y)

重构函数:line14 - line26

15-6 ⾃动⽣成标签

请修改和 dice_ die_ ,将⽤来设置hist.x_labels值的列表替换为⼀个⾃动⽣成这种列表的循环。如果你熟悉列表

解析,可尝试将die_和dice_中其他for循环也替换为列表解析。

[注:这⾥有个modification—This should say to modify die_, not . This will be corrected in future printings.]

from die_1 import Die

import pygal

# D6

创建⼀个

die = Die()

#

掷⼏次骰⼦,并将结果存储在⼀个列表中

results = [die.roll() for roll_num in range(1000)]

#

分析结果

frequencies = [results.count(value) for value in range(1, die.num_sides+1)]

#

对结果进⾏可视化

hist = pygal.Bar()

hist.title = "Results of rolling one D6 1000 times."

hist.x_labels = [str(value) for value in range(1, die.num_sides+1)]

hist.x_title = "Result"

hist.y_title = "Frequency of Result"

hist.add('D6', frequencies)

hist.render_to_file('die_')

列表解析

将for循环和创建新元素的代码合并成⼀⾏,并⾃动附加新元素。

Line 8, 11, 17为列表解析的代码。

⼀般语句为:

列表名 = [a的函数 for a in range()]

这点要理解⼀下。能写出来。

可视化如下

15-7 两个D8骰⼦

请模拟同时掷两个8⾯骰⼦1000次的结果。逐渐增加掷骰⼦的次数,直到系统不堪重负为⽌。

import pygal

from die_1 import Die

# D8

创建两个骰⼦

die_1 = Die(8)

die_2 = Die(8)

#

掷骰⼦多次,并将结果存储到⼀个列表中

results = []

for roll_num in range(1000):

result = die_1.roll() + die_2.roll()

results.append(result)

#

分析结果

frequencies = []

max_result = die_1.num_sides + die_2.num_sides

for value in range(2, max_result+1):

frequency = results.count(value)

frequencies.append(frequency)

#

可视化结果

hist = pygal.Bar()

hist.title = "Results of rolling two D8 dice 1000 times."

hist.x_labels = [str(value) for value in range(2, max_result+1)]

hist.x_title = "Result"

hist.y_title = "Frequency of Result"

hist.add('D8 + D8', frequencies)

hist.render_to_file('dice_visual_')

如何修改

主要是给Die类传递实参8。

修改标题,修改标签。

系统不堪重负

⼤概次数增加到1000万次后,时间达到30s左右。

⼀亿次时,感觉PC要炸。

1000次图如下

15-8 同时掷三个骰⼦

如果你同时掷三个D6骰⼦,可能得到的最⼩点数为3,⽽最⼤点数为18。请通过可视化展⽰同时掷三个D6骰⼦的结果。

import pygal

from die_1 import Die

# D6

创建三个骰⼦

die_1 = Die()

die_2 = Die()

die_3 = Die()

#

掷骰⼦多次,并将结果存储到⼀个列表中

results = []

for roll_num in range(10000):

result = die_1.roll() + die_2.roll() + die_3.roll()

results.append(result)

#

分析结果

frequencies = []

max_result = die_1.num_sides + die_2.num_sides + die_3.num_sides

for value in range(3, max_result+1):

frequency = results.count(value)

frequencies.append(frequency)

#

可视化结果

hist = pygal.Bar()

hist.title = "Results of rolling three D6 dice 10000 times."

hist.x_labels = [str(value) for value in range(3, max_result+1)]

hist.x_title = "Result"

hist.y_title = "Frequency of Result"

hist.add('D6 + D6 + D6', frequencies)

hist.render_to_file('dice_visual_')

①多创建⼀个Die()实例。(因为默认值为)

②修改标题,标签。

③将最⼩和修改为3。

可视化结果如下:

15-9 将点数相乘

同时掷两个骰⼦时,通常将它们的点数相加。请通过可视化展⽰将两个骰⼦的点数相乘的结果。

import pygal

from die_1 import Die

# 2D6

创建骰⼦

die_1 = Die()

die_2 = Die()

#

掷骰⼦多次,并将结果存储到⼀个列表中

results = []

for roll_num in range(100000):

result = die_1.roll() * die_2.roll()

results.append(result)

#

分析结果

frequencies = []

max_result = die_1.num_sides * die_2.num_sides

for value in range(1, max_result+1):

frequency = results.count(value)

frequencies.append(frequency)

#

可视化结果

hist = pygal.Bar()

hist.title = "Results of rolling three D6 dice 100000 times."

hist.x_labels = [str(value) for value in range(1,max_result+1)]

hist.x_title = "Result"

hist.y_title = "Frequency of Result"

hist.add('D6 * D6', frequencies)

hist.render_to_file('dice_visual_')

15-10 练习使⽤本章介绍的两个库

尝试使⽤matplotlib通过可视化来模拟掷骰⼦的情况,并尝试使⽤Pygal通过可视化来模拟随机漫步的情况。

玫瑰花怎么写-骚岳

《Python编程:从入门到实践》第15章-生成数据习题

本文发布于:2023-05-27 15:51:13,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1685173874177543.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:《Python编程:从入门到实践》第15章-生成数据习题.doc

本文 PDF 下载地址:《Python编程:从入门到实践》第15章-生成数据习题.pdf

标签:随机漫步
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|