網(wǎng)上有很多關(guān)于巧用pos機(jī),讓你的 Python 可視化大放異彩的知識,也有很多人為大家解答關(guān)于巧用pos機(jī)的問題,今天pos機(jī)之家(www.bulldancerbisonranch.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
巧用pos機(jī)
原創(chuàng):Hanz 源:Python數(shù)據(jù)之道
— 1 —前言
如果你對本文的代碼感興趣,可以去 Github (文末提供)里查看。第一次運(yùn)行的時候會報一個錯誤(還沒找到解決辦法),不過只要再運(yùn)行一次就正常了。
這篇文章雖然不是篇典型的數(shù)據(jù)科學(xué)類文章,不過它涉及到數(shù)據(jù)科學(xué)以及商業(yè)智能的應(yīng)用。Python 的 Matplotlib 是最常用的圖表繪制以及數(shù)據(jù)可視化庫。我們對折線圖、柱狀圖以及熱力圖都比較熟悉,但你知道用 Matplotlib 還能做簡單的動畫嗎?
下面就是用 Matplotlib 制作動畫的例子。展示的是 John Conway 的 《The Game of Life》,這是一個 Metis(數(shù)據(jù)科學(xué)夏令營)中的編程挑戰(zhàn)題目,同時給了我一個機(jī)會來制作我的第一個 Python 動畫。看看結(jié)果的動圖:
這篇文章的重點還是主要放在 python 中如何用 Matploylib 制作動畫。
但如果你不太熟悉模擬游戲的話(它更像是可以看的模擬動畫,而非可以玩的游戲),我來給大家介紹一下規(guī)則:
一開始先設(shè)置一個 N×N 的網(wǎng)格(我的動畫中用的是 50×50 );接著隨機(jī)地向格子中填充“小細(xì)胞”(一開始隨機(jī)地從 2500 個格子中選取 1500 個進(jìn)行填充);如果鄰居小細(xì)胞少于等于 1 個,那格子中的小細(xì)胞會死掉;如果鄰居大于等于 4 個的也會死掉;只有 2 個或 3 個鄰居時可以生存;空的格子中如果正好有 3 個鄰居,則會長出 1 個新的“小細(xì)胞”;— 2 —建立網(wǎng)格
我們首先導(dǎo)入所需的庫。
import timefrom IPython import displayimport matplotlib.pyplot as pltimport matplotlib.animation as animation
我們會利用 Matploylib 動畫模塊中的 FuncAnimation() 函數(shù)。 FuncAnimation()是通過多次調(diào)用一個函數(shù)并逐次更新圖片來實現(xiàn)讓圖片動起來的。 我們來一步步地實現(xiàn)這個過程。
但首先,我們需要先初始化我們的網(wǎng)格。下面的幾行代碼用來存儲我們輸入的數(shù)據(jù):
我們需要一個 50×50 大小的網(wǎng)格;pad 變量可以使得計算鄰居變得更容易。通過在邊界外添加一層空白格子,我們就不需要額外再寫一個邏輯來處理網(wǎng)格的邊界。因此我們 50×50 的網(wǎng)格其實是被一圈空白格子包圍著,這使得實際的 numpy 序列的大小為 52×52;initial_cels 變量表示在網(wǎng)格啟動的時候我們想要多少“小細(xì)胞”。他們會被隨機(jī)地分布在網(wǎng)格上。# Input variables for the boardboardsize = 50 # board will be X by X where X = boardsizepad = 2 # padded border, do not change this!initial_cells = 1500 # this number of initial cells will be placed # in randomly generated positions
接下來我們隨機(jī)地生成一系列“小細(xì)胞”的初始坐標(biāo)(上面我們選擇了 1500 個)。把這些坐標(biāo)存儲在 pos_list 變量中。
# Get a list of random coordinates so that we can initialize# board with randomly placed organismspos_list = []for i in range(initial_cells): pos_list.append([random.randint(1, boardsize), random.randint(1, boardsize)])
然后我們是時候該初始化網(wǎng)格了。我們會用一組叫 my_board 的 numpy 序列來代表我們的網(wǎng)格——我們先生成一個 52×52 數(shù)值為 0 的矩陣序列作為開始(比 50×50 大是由于增加了空白邊緣),然后調(diào)用 init_board() 函數(shù)來根據(jù) pos_list 中的坐標(biāo)把“小細(xì)胞”填充到網(wǎng)格中。輔助函數(shù)的具體細(xì)節(jié)我不再展開講了,不過我把他們都整理到我的 Github 上了。
# Initialize the boardmy_board = np.zeros((boardsize+pad, boardsize+pad))my_board = init_board(pos_list, my_board)
— 3 —制作網(wǎng)格動畫
這是我們最期待的部分——動畫!首先,我們需要完善一些配置。下面的幾行代碼用來生成展示我們動畫的 mtplotlib 圖框。
# Required line for plotting the animation%matplotlib notebook# Initialize the plot of the board that will be used for animationfig = plt.gcf()
接下來制作我們的第一幀。 mtplotlib 中的 imshow() 函數(shù)可以接收一組 numpy 矩陣然后返回一張圖片。很酷吧!
# Show first image - which is the initial boardim = plt.imshow(my_board)plt.show()
傳入 imshow() 的變量是我們的初始的網(wǎng)格 my_board。生成的圖片長這樣:
現(xiàn)在我們需要寫一個可以給 FuncAnimation() 調(diào)用的輔助函數(shù)。 animate() 函數(shù)接受一幀畫面作為輸入充當(dāng)計數(shù)器。這個畫面計數(shù)器就是 FuncAnimation() 和 animate() 函數(shù)溝通的橋梁——在每一個時間點(也就是每一幀),它都會調(diào)用一次 animate()。然后 animate() 會逐次使用輔助函數(shù) update_board() 來對網(wǎng)格進(jìn)行迭代。最后, set_data() 函數(shù)將圖片更新為迭代后的網(wǎng)格,這就完成了。
# Helper function that updates the board and returns a new image of# the updated board animate is the function that FuncAnimation callsdef animate(frame): im.set_data(update_board(my_board)) return im,
一切順利!我們準(zhǔn)備調(diào)用 FuncAnimation() 函數(shù)了。注意輸入的參數(shù):
fig 是我們在前面創(chuàng)建的用來裝載我們的動畫的圖形變量;animate 是 FuncAnimation() 用畫面計數(shù)器進(jìn)行溝通的函數(shù)(自動傳入,不需要特別聲明)frames 表示我們希望動畫持續(xù)多少幀,在這里我們想要動畫的長度為 200 幀;interval 表示每一幀之間間隔的毫秒數(shù)。我們想要每幀之間間隔 50 毫秒。# This line creates the animationanim = animation.FuncAnimation(fig, animate, frames=200, interval=50)
就這么簡單!不是很難吧?為了慶祝我們成功制作動畫,我再送大家一個動畫:
— 4 —總結(jié)
希望這篇文章能幫到大家。在結(jié)束之前,讓我來幫助大家腦補(bǔ)更多我們今天學(xué)到的動畫功能在數(shù)據(jù)科學(xué)上的應(yīng)用:
一個個地畫出蒙特卡洛模擬數(shù)據(jù),你能觀察到最終的分布是如何逐步形成的;按順序遍歷時間序列數(shù)據(jù),可以描繪你的模型或數(shù)據(jù)在新的觀察角度下有什么表現(xiàn);當(dāng)你改變輸入?yún)?shù)時,比如族群數(shù),可以展現(xiàn)你的算法是如何劃分族群的;根據(jù)時間或不同的數(shù)據(jù)子集生成關(guān)聯(lián)熱力圖,用于觀察不同的樣本是如何影響你的模型的預(yù)期參數(shù)的。Github: https://github.com/yiuhyuk/game_of_life
來源:https://towardsdatascience.com/spice-up-your-python-visualizations-with-matplotlib-animations-d437d7e98e67
最后,我自己是一名從事了多年開發(fā)的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個月整理了一份最適合2019年學(xué)習(xí)的Python學(xué)習(xí)干貨,可以送給每一位喜歡Python的小伙伴,想要獲取的可以關(guān)注我的頭條號并在后臺私信我:01,即可免費(fèi)獲取。
怪物獵人長刀技巧?
1/4
利用預(yù)判空揮氣刃斬開刃。
典型案例,電龍,在電龍原地放電的時候,可以空揮氣刃斬1-3式,當(dāng)電龍放電完畢還有來下步動作的時候氣刃大回旋開刃。當(dāng)電龍飛撲前置動作出現(xiàn)時,預(yù)判電龍落點,提前空揮氣刃斬,落地還未起身大回旋命中
2/4
利用硬直倒地開刃。
典型案例,盾蟹鐮蟹,當(dāng)怪物出現(xiàn)硬直時,直接短開刃收刀走人。當(dāng)怪物出現(xiàn)倒地時長開刃極旋。
3/4
利用小怪續(xù)刃。
情景分析:速龍怪物類,會召喚很多小速龍,而boss自身比較活躍。當(dāng)打出氣刃1-3后發(fā)現(xiàn)boss逃出攻擊范圍,鼠標(biāo)迅速調(diào)整到附近小怪身上大回旋,也可以達(dá)到開刃/續(xù)刃的效果。
4/4
巧用集氣斬續(xù)刃。
在內(nèi)的近乎所有太刀都是寧可大回旋也不用集氣斬,那么在此先自我檢討一下。太刀作為一個沒有防御的近戰(zhàn)職業(yè),自身的動作比較大,招式結(jié)束后的poss時間也比較久。
在于怪物的近身搏斗中盲目用大回旋是一個比較危險的選擇。而集氣斬的釋放前置可以比大回旋少1下氣刃斬3式。而動作相對大回旋又比較小。在一些尷尬的地形,如墻邊與地圖交界處。選擇集氣斬續(xù)刃則會更加理想。
以上就是關(guān)于巧用pos機(jī),讓你的 Python 可視化大放異彩的知識,后面我們會繼續(xù)為大家整理關(guān)于巧用pos機(jī)的知識,希望能夠幫助到大家!









