1. 程式人生 > >【Python程式設計:從入門到實踐】第十五章:生成資料

【Python程式設計:從入門到實踐】第十五章:生成資料

15-1 立方:數字的三次方被稱為其立方。請繪製一個圖形,顯示前5個整數的立方值,在繪製一個圖形,顯示前面5000個整數的立方值。

 前5個整數的立方值:

import matplotlib.pyplot as plt

x_values  = [1,2,3,4,5]
y_values = [1,8,27,64,125]
plt.title("Li Fang ")
plt.plot(x_values,y_values,linewidth = 5)
plt.xlabel("Value",fontsize = 14)
plt.ylabel("Square of Value",fontsize = 14)
plt.tick_params(axis = 'both' , labelsize = 14)
plt.show()
結果:

前面5000個整數的立方值:

import matplotlib.pyplot as plt

x_values  = list(range(1,50001))
y_values = [x**3 for x in x_values]
plt.title("Li Fang ")
plt.scatter(x_values,y_values,linewidth = 5,edgecolor = 'none')
plt.xlabel("Value",fontsize = 14)
plt.ylabel("Square of Value",fontsize = 14)
plt.tick_params(axis = 'both' , labelsize = 14)
plt.show()

結果:



15-2 彩色立方:給你前面的立方圖指定顏色對映

import matplotlib.pyplot as plt

x_values  = [1,2,3,4,5]
y_values = [1,8,27,64,125]
plt.title("Li Fang ")
plt.plot(x_values,y_values,linewidth = 5,c = 'red')
plt.xlabel("Value",fontsize = 14)
plt.ylabel("Square of Value",fontsize = 14)
plt.tick_params(axis = 'both' , labelsize = 14)
plt.show()
結果:



15-3 分子運動:修改rw_visual.py,將其中的plt.scatter()替換為plt.plot(),為模擬花粉在水滴表面的運動路徑,向plt.plot()傳遞rw.x_values和rw.y_values,並指定實參值linewidth。使用5000個點而不是50000個點。

rw_visual.py

import matplotlib.pyplot as plt

from random_walk import RandomWalk
rw = RandomWalk()
rw.fill_walk()
plt.plot(rw.x_values,rw.y_values,linewidth = 2)

plt.show()
random_walk.py
from random import choice
class RandomWalk(object):
	"""docstring for RandomWalk"""
	def __init__(self, num_points = 5000):
		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([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

			if x_step == 0  and y_step ==0:
				continue
			else:
				next_x = self.x_values[-1] + x_step
				next_y = self.y_values[-1] + y_step

				self.x_values.append(next_x)
				self.y_values.append(next_y)
結果:

15-4 改進的隨機漫步:在類RandomWalk中,x_step 和 y_step 是根據相同的條件生成的:從列表【1,-1】中隨機地選擇方向,並經列表【0,1,2,3,4】中隨機地選擇距離。請修改這些列表中的值,看看對隨機漫步路徑有何影響。長沙使用更長距離選擇列表,如0~8;或者將-1從x或y方向列表中刪除

15-5 重構:方法fill_walk()很長。請新建一個名為get_step()的方法,用於確定每次漫步的距離和方向,並計算這次漫步將如何移動。然後,在fill_work() 中呼叫get_step()兩次:

x_step = self.get_step()

y_step = self.get_step()

通過這樣的重構,可縮小fill_walk() 的規模,讓這個方法閱讀和理解起來更容易

from random import choice class RandomWalk(object): """docstring for RandomWalk""" def __init__(self, num_points = 5000): 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_step = self.get_step() y_step = self.get_step() if x_step == 0 and y_step ==0: continue else: next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.add(next_x) self.y_values.add(next_y) def get_step(self): direction = choice([1,-1]) distance = choice([0,1,2,3,4]) step = direction * distance return step
15-6 自動生成標籤:請修改die.py 和 dice_visual.py,將用來設定 hist.x_labels 值的列表替換為位元組自動生成這種列表的迴圈。如果你熟悉列表解析,可嘗試將 die_visual.py 和 dice_visual.py 中的其他 for 迴圈也替換為列表解析。

die_visual.py

from die import Die
import pygal
def num2char(x):
	return str(x)
die1 = Die()
die2 = Die()
results = []

for roll_num in range(1000):
	result = die1.roll() + die2.roll()
	results.append(result)
# print(results)
frequencies = []
max_result = die1.num_sides + die2.num_sides
for value in range(1,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

hist = pygal.Bar()
hist.title = "Result of rolling me D6 1000 times."
hist.x_labels = list(map(num2char,list(range(1,max_result+1))))
print(hist.x_labels)
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

hist.add('D6+D6',frequencies)
hist.render_to_file('dice1_visual.svg')


15-7 兩個D8骰子:請模擬同時透支兩個8面骰子1000次的結果。逐漸增加投擲骰子的次數,知道系統不堪重負為止。

die.py

from random import randint
class Die(object):
	"""docstring for Die"""
	def __init__(self, num_sides = 8):
		self.num_sides = num_sides

	def roll(self):
		return randint(1,self.num_sides)
		
die_visual.py
from die import Die
import pygal

die1 = Die()
die2 = Die()
results = []

for roll_num in range(1000):
	result = die1.roll() + die2.roll()
	results.append(result)
frequencies = []
max_result = die1.num_sides + die2.num_sides
for value in range(2,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

hist = pygal.Bar()
hist.title = "Result of rolling me D8 1000 times."
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

hist.add('D8+D8',frequencies)
hist.render_to_file('dice1_visual.svg')
結果:

15-8 同時投擲三個骰子:如果你同時擲三個D6骰子,可能得到的最小點數為3,而最大點數為18,。請通過視覺化展示同時擲三個D6骰子的結果

die_visual.py

from die import Die
import pygal

die1 = Die()
die2 = Die()
die3 = Die()
results = []

for roll_num in range(1000):
	result = die1.roll() + die2.roll() +  die3.roll()
	results.append(result)
frequencies = []
max_result = die1.num_sides + die2.num_sides + die3.num_sides
for value in range(2,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

hist = pygal.Bar()
hist.title = "Result of rolling me D6 1000 times."
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

hist.add('D6+D6+D6',frequencies)
hist.render_to_file('dice1_visual.svg')
結果:

15-9 將點數相乘:同時擲兩個骰子時,通常將它們的點數相加。通過視覺化展示將兩個骰子的點數相乘的結果

from die import Die
import pygal
def num2char(x):
	return str(x)
die1 = Die()
die2 = Die()
results = []

for roll_num in range(1000):
	result = die1.roll() * die2.roll()
	results.append(result)
# print(results)
frequencies = []
max_result = die1.num_sides * die2.num_sides
for value in range(1,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

hist = pygal.Bar()
hist.title = "Result of rolling me D6 1000 times."
hist.x_labels = list(map(num2char,list(range(1,max_result+1))))
print(hist.x_labels)
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

hist.add('D6*D6',frequencies)
hist.render_to_file('dice1_visual.svg')

結果:



15-10 練習使用本章介紹的兩個庫:嘗試使用 matplotlib 通過視覺化來模擬值骰子的情況。
die_scatter.py

import matplotlib.pyplot as plt
from die import Die

die1 = Die()
die2 = Die()
results = []

for roll_num in range(1000):
	result = die1.roll() + die2.roll()
	results.append(result)
# print(results)
frequencies = []
max_result = die1.num_sides + die2.num_sides
for value in range(1,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)
print(frequencies)
plt.plot(list(range(1,max_result+1)),frequencies,linewidth = 2)
plt.title("Result of rolling me D6 1000 times.")
plt.xlabel ("Result",fontsize = 14)
plt.ylabel("Square of D6 1000 times")
plt.show()
結果:

random_walk_Pygal.py

相關推薦

Python程式設計入門實踐生成資料

15-1 立方:數字的三次方被稱為其立方。請繪製一個圖形,顯示前5個整數的立方值,在繪製一個圖形,顯示前面5000個整數的立方值。 前5個整數的立方值:import matplotlib.pyplot as plt x_values = [1,2,3,4,5] y_val

Python程式設計入門實踐武裝飛船

12-1 藍色天空 :建立一個背景為藍色的Pygame視窗。 import sys import pygame def run(): pygame.init() screen = pygame.display.set_mode((1200,600)) pygame.d

小白看的Java教程,更聰明的寫程式碼方法

之前講解的迴圈操作,可以解決的是程式碼重複的問題,但是此時的重複的程式碼必須是有規律的。那迴圈操作,能解決所有的程式碼重複嗎?答案肯定是不行的,比如針對於某一種功能的重複操作,迴圈解決不了,終於方法就該登場了。舉個例子。 編寫一個飛機大戰遊戲,程式在執行過程中

Python 程式設計入門實踐(生成資料)練習題答案

# -*- coding: gbk -*- import matplotlib.pyplot as plt input_values = [1,2,3,4,5] squares = [1,4,9,16,25] plt.plot(input_values,squ

程式設計珠璣--字串用字尾陣列查詢最長不重疊的重複子串

問題:給定一個文字檔案作為輸入,查詢其中最長的重複子字串。例如:“Ask not what your country can do for you, but what you can do for y

練習題--類和物件(Think Python

別名有可能讓程式讀起來有困難,因為在一個位置做出的修改有可能導致另外一個位置發生不可預知的情況。這樣也很難去追蹤指向一個物件的所有變數。所以就可以不用別名,而用複製物件的方法。copy 模組包含了一個名叫 copy 的函式,可以複製任意物件: >>> p1 = Point()

跟我學oracle18cMultitenant Architecture多租戶框架1.3 Path to Database Consolidation

在其存在期間, a database is either a CDB or a non-CDB. 您必須在建立時將資料庫定義為CDB,然後在這個CDB中建立PDBs和應用程式容器。. You cannot later transform a non-CDB into a CDB, or a CD

JanusGraph使用索引提升效能

11. 使用索引提升效能 Chapter 11. Indexing for Better Performance JanusGraph支援2種類型的索引用以提升查詢處理速度,分別是圖索引(graph indexes)和中心節點索引(vertex-centric inde

小白看的Java教程,有條不紊

列印陣列元素(掌握) API中還有一個專門運算元組的工具類Arrays,該類提供了對陣列元素的拷貝、元素搜尋、元素排序、列印等功能方法,且該類為不同資料型別的陣列都過載了相同功能的方法。 需求:通過呼叫Arrays類中的toString方法完成列印陣列元素的

Python核心程式設計第二版正則表示式(課後習題)----我的答案

15-1.識別下列字串:“bat”,“bit”,“but”,“hat”,“hit“或”hut“。import re key = 'batshdajbut' p1 = r'(bat|bit|but|hat|hit|hut)' pattern1 = re.compile(p1)

小白看的Java教程,讓陣列動起來

基本操作(重點) int[] nums = new int[]{1,3,5,7}; + 獲取陣列長度,語法:int size =  陣列名.length; int size = nums.length; -> 輸出結果4 + 獲取元素值,

小白看的Java教程,更復雜一點的陣列操作

陣列拷貝(掌握) 需求:定義一個方法arraycopy完成int型別陣列的拷貝 實現int型別陣列元素拷貝(掌握) 從指定源陣列中從指定的位置開始複製指定數量的元素到目標陣列的指定位置。 src - 源陣列 srcPos - 源陣列中的開始索引

Java程式設計思想 泛型

1. 泛型 “泛型”意思就是適用於許多型別。 使用泛型的目的之一: 指定容器持有什麼型別,讓編譯器確保正確性,而不是在執行期發現錯誤。 這個容器可以看成是有其他型別物件作為成員的類,而不單單只是JDK中的容器類。 2.簡單的泛型 2.1 元組

零開始Desire HD刷機指南——如何重新整理radio

原文地址:http://blog.sina.com.cn/s/blog_722b43a60100q5k5.html 本教程由symen 原創,轉載請註明出處。 通常,重新整理radio 可以幫助我們改善訊號問題,無論是電話訊號,還是wifi 訊號,如果你對目前手機的

零基礎入門學習java對象的比較

obj println lse 來看 filter () 情況 轉換 行修改 這一篇主要講講對象的比較,什麽是對象的比較,我們知道兩個數值類型只需要用“==”符號即可進行相等判斷,但如果是兩個Goods對象呢?如何進行比較?這時候,我們的equals

Swift入門到精通篇 - 型別轉換 初識

型別轉換(學習筆記) 環境Xcode 11.0 beta4 swift 5.1 型別轉換 型別轉換是檢查例項型別的一種方法,或者檢查來自類層級不同的父類或子類一個例項,用 is 和 as 操作符 為型別轉換定義層級結構 示例 class MediaItem { var name: Stri

WPF學習 WPF事件

  前兩章學習了WPF事件的工作原理,現在分析一下在程式碼中可以處理的各類事件。儘管每個元素都提供了許多事件,但最重要的事件通常包括以下5類:   生命週期事件:在元素被初始化、載入或解除安裝時發生這些事件。   滑鼠事件:這些事件是滑鼠動作的結果。   鍵盤事件:這些事件是鍵盤動作(如按下鍵盤上的鍵)的結

鳥哥的Linux私房菜——正規表示法

打印 全部 相關 sed 新增 class 簡介 rep .com   視頻鏈接   土豆:   B站:   本章講的是   目錄如下 1. 前言:2. 基礎正規表示法:2.1 以 grep 擷取字符串      (grep -iv i是忽略大小寫,v是反

“全棧2019”JavaUnicode與轉義字符

href idea inf 版權 下劃線 學習計劃 基礎 意義 第十五章 難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文鏈接 “全棧2019”Java第十五章:Unic

演算法導論 動態規劃之棒的切割(Rod Cutting)

    和分治法一樣,動態規劃(Dynamic programming)是通過組合子問題的解而解決整個問題的。 其不同點在於: 1)分治法是將問題劃分成一些獨立的子問題,遞迴求解各個子問題,然後合併子問題的解而得到原問題的解 2)動態規劃使用於子問題不獨立的情況,也就是各個