欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何基于Python Matplotlib實(shí)現(xiàn)網(wǎng)格動(dòng)畫

 更新時(shí)間:2020年07月20日 11:40:57   作者:吃著東西不想停  
這篇文章主要介紹了如何基于Python Matplotlib實(shí)現(xiàn)網(wǎng)格動(dòng)畫,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

—1—

如果你對(duì)本文的代碼感興趣,可以去 Github (文末提供)里查看。第一次運(yùn)行的時(shí)候會(huì)報(bào)一個(gè)錯(cuò)誤(還沒找到解決辦法),不過只要再運(yùn)行一次就正常了。

這篇文章雖然不是篇典型的數(shù)據(jù)科學(xué)類文章,不過它涉及到數(shù)據(jù)科學(xué)以及商業(yè)智能的應(yīng)用。Python 的 Matplotlib 是最常用的圖表繪制以及數(shù)據(jù)可視化庫。我們對(duì)折線圖、柱狀圖以及熱力圖都比較熟悉,但你知道用 Matplotlib 還能做簡(jiǎn)單的動(dòng)畫嗎?

下面就是用 Matplotlib 制作動(dòng)畫的例子。展示的是 John Conway 的 《The Game of Life》,這是一個(gè) Metis(數(shù)據(jù)科學(xué)夏令營(yíng))中的編程挑戰(zhàn)題目,同時(shí)給了我一個(gè)機(jī)會(huì)來制作我的第一個(gè) Python 動(dòng)畫。看看結(jié)果的動(dòng)圖:

這篇文章的重點(diǎn)還是主要放在 python 中如何用 Matploylib 制作動(dòng)畫。

但如果你不太熟悉模擬游戲的話(它更像是可以看的模擬動(dòng)畫,而非可以玩的游戲),我來給大家介紹一下規(guī)則:

  • 一開始先設(shè)置一個(gè) N×N 的網(wǎng)格(我的動(dòng)畫中用的是 50×50 );
  • 接著隨機(jī)地向格子中填充“小細(xì)胞”(一開始隨機(jī)地從 2500 個(gè)格子中選取 1500 個(gè)進(jìn)行填充);
  • 如果鄰居小細(xì)胞少于等于 1 個(gè),那格子中的小細(xì)胞會(huì)死掉;
  • 如果鄰居大于等于 4 個(gè)的也會(huì)死掉;
  • 只有 2 個(gè)或 3 個(gè)鄰居時(shí)可以生存;
  • 空的格子中如果正好有 3 個(gè)鄰居,則會(huì)長(zhǎng)出 1 個(gè)新的“小細(xì)胞”;

—2—

建立網(wǎng)格

我們首先導(dǎo)入所需的庫。

import time
from IPython import display
import matplotlib.pyplot as plt
import matplotlib.animation as animation

我們會(huì)利用Matploylib 動(dòng)畫模塊中的 FuncAnimation() 函數(shù)。 FuncAnimation()是通過多次調(diào)用一個(gè)函數(shù)并逐次更新圖片來實(shí)現(xiàn)讓圖片動(dòng)起來的。我們來一步步地實(shí)現(xiàn)這個(gè)過程。

但首先,我們需要先初始化我們的網(wǎng)格。下面的幾行代碼用來存儲(chǔ)我們輸入的數(shù)據(jù):

  • 我們需要一個(gè) 50×50 大小的網(wǎng)格;
  • pad 變量可以使得計(jì)算鄰居變得更容易。通過在邊界外添加一層空白格子,我們就不需要額外再寫一個(gè)邏輯來處理網(wǎng)格的邊界。因此我們 50×50 的網(wǎng)格其實(shí)是被一圈空白格子包圍著,這使得實(shí)際的 numpy 序列的大小為 52×52;
  • initial_cels 變量表示在網(wǎng)格啟動(dòng)的時(shí)候我們想要多少“小細(xì)胞”。他們會(huì)被隨機(jī)地分布在網(wǎng)格上。
# Input variables for the board
boardsize = 50    # board will be X by X where X = boardsize
pad = 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 個(gè))。把這些坐標(biāo)存儲(chǔ)在 pos_list 變量中。

# Get a list of random coordinates so that we can initialize
# board with randomly placed organisms
pos_list = []
for i in range(initial_cells):
  pos_list.append([random.randint(1, boardsize),
           random.randint(1, boardsize)])

然后我們是時(shí)候該初始化網(wǎng)格了。我們會(huì)用一組叫 my_board 的 numpy 序列來代表我們的網(wǎng)格——我們先生成一個(gè) 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 board
my_board = np.zeros((boardsize+pad, boardsize+pad))
my_board = init_board(pos_list, my_board)

—3—

制作網(wǎng)格動(dòng)畫

這是我們最期待的部分——?jiǎng)赢?!首先,我們需要完善一些配置。下面的幾行代碼用來生成展示我們動(dòng)畫的 mtplotlib 圖框。

# Required line for plotting the animation
%matplotlib notebook
# Initialize the plot of the board that will be used for animation
fig = plt.gcf()

接下來制作我們的第一幀。 mtplotlib 中的 imshow() 函數(shù)可以接收一組 numpy 矩陣然后返回一張圖片。很酷吧!

# Show first image - which is the initial board
im = plt.imshow(my_board)
plt.show()

傳入 imshow() 的變量是我們的初始的網(wǎng)格 my_board。生成的圖片長(zhǎng)這樣:

現(xiàn)在我們需要寫一個(gè)可以給 FuncAnimation() 調(diào)用的輔助函數(shù)。 animate() 函數(shù)接受一幀畫面作為輸入充當(dāng)計(jì)數(shù)器。這個(gè)畫面計(jì)數(shù)器就是 FuncAnimation() 和 animate() 函數(shù)溝通的橋梁——在每一個(gè)時(shí)間點(diǎn)(也就是每一幀),它都會(huì)調(diào)用一次 animate()。然后 animate() 會(huì)逐次使用輔助函數(shù) update_board() 來對(duì)網(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 calls
def animate(frame):
  im.set_data(update_board(my_board))
  return im,

一切順利!我們準(zhǔn)備調(diào)用 FuncAnimation() 函數(shù)了。注意輸入的參數(shù):

  • fig 是我們?cè)谇懊鎰?chuàng)建的用來裝載我們的動(dòng)畫的圖形變量;
  • animate 是 FuncAnimation() 用畫面計(jì)數(shù)器進(jìn)行溝通的函數(shù)(自動(dòng)傳入,不需要特別聲明)
  • frames 表示我們希望動(dòng)畫持續(xù)多少幀,在這里我們想要?jiǎng)赢嫷拈L(zhǎng)度為 200 幀;
  • interval 表示每一幀之間間隔的毫秒數(shù)。我們想要每幀之間間隔 50 毫秒。
# This line creates the animation
anim = animation.FuncAnimation(fig, animate, frames=200,
                interval=50)

就這么簡(jiǎn)單!不是很難吧?為了慶祝我們成功制作動(dòng)畫,我再送大家一個(gè)動(dòng)畫:

—4—

總結(jié)

希望這篇文章能幫到大家。在結(jié)束之前,讓我來幫助大家腦補(bǔ)更多我們今天學(xué)到的動(dòng)畫功能在數(shù)據(jù)科學(xué)上的應(yīng)用:

  • 一個(gè)個(gè)地畫出蒙特卡洛模擬數(shù)據(jù),你能觀察到最終的分布是如何逐步形成的;
  • 按順序遍歷時(shí)間序列數(shù)據(jù),可以描繪你的模型或數(shù)據(jù)在新的觀察角度下有什么表現(xiàn);
  • 當(dāng)你改變輸入?yún)?shù)時(shí),比如族群數(shù),可以展現(xiàn)你的算法是如何劃分族群的;
  • 根據(jù)時(shí)間或不同的數(shù)據(jù)子集生成關(guān)聯(lián)熱力圖,用于觀察不同的樣本是如何影響你的模型的預(yù)期參數(shù)的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會(huì))

    將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會(huì))

    這篇文章主要給大家介紹了關(guān)于如何將.ipynb文件轉(zhuǎn)換成.py文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),大家基本一看就會(huì),需要的朋友可以參考下
    2023-07-07
  • 9行Python3代碼實(shí)現(xiàn)批量提取PDF文件的指定內(nèi)容

    9行Python3代碼實(shí)現(xiàn)批量提取PDF文件的指定內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何通過9行Python3代碼實(shí)現(xiàn)批量提取PDF文件的指定內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-12-12
  • 淺談pycharm使用及設(shè)置方法

    淺談pycharm使用及設(shè)置方法

    這篇文章主要介紹了淺談pycharm使用及設(shè)置方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python進(jìn)程間通信用法實(shí)例

    Python進(jìn)程間通信用法實(shí)例

    這篇文章主要介紹了Python進(jìn)程間通信用法,涉及Python通過multiprocessing模塊操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • python使用正則表達(dá)式替換匹配成功的組

    python使用正則表達(dá)式替換匹配成功的組

    正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法。這篇文章主要介紹了python里使用正則表達(dá)式來替換匹配成功的組,需要的朋友可以參考下
    2017-11-11
  • 解讀numpy中改變數(shù)組維度的幾種方式

    解讀numpy中改變數(shù)組維度的幾種方式

    這篇文章主要介紹了numpy中改變數(shù)組維度的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • pytorch中nn.Flatten()函數(shù)詳解及示例

    pytorch中nn.Flatten()函數(shù)詳解及示例

    nn.Flatten是一個(gè)類,而torch.flatten()則是一個(gè)函數(shù),下面這篇文章主要給大家介紹了關(guān)于pytorch中nn.Flatten()函數(shù)詳解及示例的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python錯(cuò)誤:AttributeError: ''module'' object has no attribute ''setdefaultencoding''問題的解決方法

    python錯(cuò)誤:AttributeError: ''module'' object has no attribute

    這篇文章主要介紹了python錯(cuò)誤:AttributeError: 'module' object has no attribute 'setdefaultencoding'問題的解決方法,需要的朋友可以參考下
    2014-08-08
  • Pycharm 如何一鍵加引號(hào)的方法步驟

    Pycharm 如何一鍵加引號(hào)的方法步驟

    這篇文章主要介紹了Pycharm 如何一鍵加引號(hào)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python 圖像的離散傅立葉變換實(shí)例

    python 圖像的離散傅立葉變換實(shí)例

    今天小編就為大家分享一篇python 圖像的離散傅立葉變換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評(píng)論