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

Python實(shí)現(xiàn)的matplotlib動(dòng)畫演示之細(xì)胞自動(dòng)機(jī)

 更新時(shí)間:2022年04月21日 09:40:07   作者:小小明-代碼實(shí)體  
這篇文章主要介紹了Python實(shí)現(xiàn)的matplotlib動(dòng)畫演示之細(xì)胞自動(dòng)機(jī),用python來模擬,首先嘗試表示Beacon,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

維基百科上有個(gè)有意思的話題叫細(xì)胞自動(dòng)機(jī):https://en.wikipedia.org/wiki/Cellular_automaton

在20世紀(jì)70年代,一種名為生命游戲的二維細(xì)胞自動(dòng)機(jī)變得廣為人知,特別是在早期的計(jì)算機(jī)界。由約翰 · 康威發(fā)明,馬丁 · 加德納在《科學(xué)美國(guó)人》的一篇文章中推廣,其規(guī)則如下:

  1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
  2. Any live cell with two or three live neighbours lives on to the next generation.
  3. Any live cell with more than three live neighbours dies, as if by overpopulation.
  4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.

總結(jié)就是:任何活細(xì)胞在有兩到三個(gè)活鄰居時(shí)能活到下一代,否則死亡。任何有三個(gè)活鄰居的死細(xì)胞會(huì)變成活細(xì)胞,表示繁殖。

在Conway’s Game of Life中,展示了幾種初始狀態(tài):

2022-04-20

下面我們用python來模擬,首先嘗試表示Beacon:

import numpy as np
import matplotlib.pyplot as plt
universe = np.zeros((6, 6), "byte")
# Beacon
universe[1:3, 1:3] = 1
universe[3:5, 3:5] = 1
print(universe)
im = plt.imshow(universe, cmap="binary")
[[0 0 0 0 0 0]
 [0 1 1 0 0 0]
 [0 1 1 0 0 0]
 [0 0 0 1 1 0]
 [0 0 0 1 1 0]
 [0 0 0 0 0 0]]

image-20220420193529574

可以看到已經(jīng)成功的打印出了Beacon的形狀,下面我們繼續(xù)編寫細(xì)胞自動(dòng)機(jī)的演化規(guī)則:

def cellular_auto(universe):
    universe_new = universe.copy()
    h, w = universe.shape
    for y in range(h):
        for x in range(w):
            neighbor_num = universe[x-1:x+2, y-1:y+2].sum()-universe[x, y]
            # 任何有三個(gè)活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個(gè)活鄰居的活細(xì)胞都能活到下一代,否則就會(huì)死亡。
            if universe[x, y] == 1 and neighbor_num not in (2, 3):
                universe_new[x, y] = 0
    return universe_new
universe = cellular_auto(universe)
print(universe)
plt.axis("off")
im = plt.imshow(universe, cmap="binary")
[[0 0 0 0 0 0]
 [0 1 1 0 0 0]
 [0 1 0 0 0 0]
 [0 0 0 0 1 0]
 [0 0 0 1 1 0]
 [0 0 0 0 0 0]]

image-20220420204319094

ArtistAnimation動(dòng)畫

基于此我們可以制作matplotlib的動(dòng)畫,下面直接將Blinker、Toad、Beacon都放上去:

from matplotlib import animation
import numpy as np
import matplotlib.pyplot as plt
%matplotlib notebook

def cellular_auto(universe):
    universe_new = universe.copy()
    h, w = universe.shape
    for y in range(h):
        for x in range(w):
            neighbor_num = universe[x-1:x+2, y-1:y+2].sum()-universe[x, y]
            # 任何有三個(gè)活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個(gè)活鄰居的活細(xì)胞都能活到下一代,否則就會(huì)死亡。
            if universe[x, y] == 1 and neighbor_num not in (2, 3):
                universe_new[x, y] = 0
    return universe_new
universe = np.zeros((12, 12), "byte")
# Blinker
universe[2, 1:4] = 1
# Beacon
universe[4:6, 5:7] = 1
universe[6:8, 7:9] = 1
# Toad
universe[8, 2:5] = 1
universe[9, 1:4] = 1
fig = plt.figure()
plt.axis("off")
im = plt.imshow(universe, cmap="binary")
frame = []
for _ in range(2):
    frame.append((plt.imshow(universe, cmap="binary"),))
    universe = cellular_auto(universe)
animation.ArtistAnimation(fig, frame, interval=500, blit=True)

2022-04-20 20

然后我們畫一下Pulsar:

# Pulsar
universe = np.zeros((17, 17), "byte")
universe[[2, 7, 9, 14], 4:7] = 1
universe[[2, 7, 9, 14], 10:13] = 1
universe[4:7, [2, 7, 9, 14]] = 1
universe[10:13, [2, 7, 9, 14]] = 1
fig = plt.figure()
plt.axis("off")
im = plt.imshow(universe, cmap="binary")
frame = []
for _ in range(3):
    frame.append((plt.imshow(universe, cmap="binary"),))
    universe = cellular_auto(universe)
animation.ArtistAnimation(fig, frame, interval=500, blit=True)

2022-04-20 21

FuncAnimation動(dòng)畫

另一種創(chuàng)建matplotlib動(dòng)畫的方法是使用FuncAnimation,完整代碼:

from matplotlib import animation
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
# %matplotlib notebook

def cellular_auto(universe):
    universe_new = universe.copy()
    h, w = universe.shape
    for y in range(h):
        for x in range(w):
            neighbor_num = universe[x-1:x+2, y-1:y+2].sum()-universe[x, y]
            # 任何有三個(gè)活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個(gè)活鄰居的活細(xì)胞都能活到下一代,否則就會(huì)死亡。
            if universe[x, y] == 1 and neighbor_num not in (2, 3):
                universe_new[x, y] = 0
    return universe_new
def update(i=0):
    global universe
    im.set_data(universe)
    universe = cellular_auto(universe)
    return im,
# Pulsar
universe = np.zeros((17, 17), "byte")
universe[[2, 7, 9, 14], 4:7] = 1
universe[[2, 7, 9, 14], 10:13] = 1
universe[4:7, [2, 7, 9, 14]] = 1
universe[10:13, [2, 7, 9, 14]] = 1
fig = plt.figure()
plt.axis("off")
im = plt.imshow(universe, cmap="binary")
plt.show()
anim = animation.FuncAnimation(
    fig, update, frames=3, interval=500, blit=True)
HTML(anim.to_jshtml())

2022-04-20 21-20

這種動(dòng)畫生成速度較慢,好處是可以導(dǎo)出html文件:

with open("out.html", "w") as f:
    f.write(anim.to_jshtml())

還可以保存MP4視頻:

anim.save("out.mp4")

或gif動(dòng)畫:

anim.save("out.gif")

注意:保存MP4視頻或GIF動(dòng)畫,需要事先將ffmpeg配置到環(huán)境變量中

ffmpeg下載地址:

鏈接: https://pan.baidu.com/s/1aioB_BwpKb6LxJs26HbbiQ?pwd=ciui 
提取碼: ciui

隨機(jī)生命游戲

接下來,我們創(chuàng)建一個(gè)50*50的二維生命棋盤,并選取其中1500個(gè)位置作為初始活細(xì)胞點(diǎn),我們看看最終生成的動(dòng)畫如何。

完整代碼如下:

from matplotlib import animation
import numpy as np
import matplotlib.pyplot as plt
%matplotlib notebook

def cellular_auto(universe):
    universe_new = universe.copy()
    h, w = universe.shape
    for y in range(1, h-1):
        for x in range(1, w-1):
            neighbor_num = universe[x-1:x+2, y-1:y+2].sum()-universe[x, y]
            # 任何有三個(gè)活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個(gè)活鄰居的活細(xì)胞都能活到下一代,否則就會(huì)死亡。
            if universe[x, y] == 1 and neighbor_num not in (2, 3):
                universe_new[x, y] = 0
    # 邊緣置零
    universe[[0, -1]] = 0
    universe[:, [0, -1]] = 0
    return universe_new
boardsize, pad = 50, 2
universe = np.zeros((boardsize+pad, boardsize+pad), "byte")
# 隨機(jī)選取1500個(gè)點(diǎn)作為初始活細(xì)胞
for i in range(1500):
    x, y = np.random.randint(1, boardsize+1, 2)
    universe[y, x] = 1
    
fig = plt.figure()
plt.axis("off")
im = plt.imshow(universe, cmap="binary")
frame = []
for _ in range(200):
    frame.append((plt.imshow(universe, cmap="binary"),))
    universe = cellular_auto(universe)
animation.ArtistAnimation(fig, frame, interval=50, blit=True)

2022-04-20 22-43

到此這篇關(guān)于Python實(shí)現(xiàn)的matplotlib動(dòng)畫演示之細(xì)胞自動(dòng)機(jī)的文章就介紹到這了,更多相關(guān)python  matplotlib動(dòng)畫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • simple-pytest?框架使用教程

    simple-pytest?框架使用教程

    simple-pytest框架主要參考了httprunner的yaml數(shù)據(jù)驅(qū)動(dòng)部分設(shè)計(jì)思路,是基于Pytest?+?Pytest-html+?Log?+?Yaml?+?Mysql?實(shí)現(xiàn)的簡(jiǎn)易版接口自動(dòng)化框架,這篇文章主要介紹了simple-pytest?框架使用指南,需要的朋友可以參考下
    2024-02-02
  • Python中的CURL PycURL使用例子

    Python中的CURL PycURL使用例子

    這篇文章主要介紹了Python中的CURL PycURL使用例子,需要的朋友可以參考下
    2014-06-06
  • python運(yùn)用sklearn實(shí)現(xiàn)KNN分類算法

    python運(yùn)用sklearn實(shí)現(xiàn)KNN分類算法

    這篇文章主要為大家詳細(xì)介紹了python運(yùn)用sklearn實(shí)現(xiàn)KNN分類算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python異常和文件處理機(jī)制詳解

    python異常和文件處理機(jī)制詳解

    這篇文章主要介紹了python異常和文件處理機(jī)制,詳細(xì)分析了Python異常處理的常用語句、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-07-07
  • Python中引用傳參四種方式介紹

    Python中引用傳參四種方式介紹

    大家好,本篇文章主要講的是Python中引用傳參四種方式介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2021-12-12
  • 教你用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng)

    教你用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng)

    今天帶大家學(xué)習(xí)怎么用python實(shí)現(xiàn)一個(gè)無界面的小型圖書管理系統(tǒng),文中有非常詳細(xì)的圖文解說及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python?如何實(shí)現(xiàn)跳過異常繼續(xù)執(zhí)行

    python?如何實(shí)現(xiàn)跳過異常繼續(xù)執(zhí)行

    這篇文章主要介紹了python?如何實(shí)現(xiàn)跳過異常繼續(xù)執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 對(duì)dataframe進(jìn)行列相加,行相加的實(shí)例

    對(duì)dataframe進(jìn)行列相加,行相加的實(shí)例

    今天小編就為大家分享一篇對(duì)dataframe進(jìn)行列相加,行相加的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python 語句的表達(dá)式和縮進(jìn)

    Python 語句的表達(dá)式和縮進(jìn)

    本篇文章將會(huì)使大家了解Python 語句、表達(dá)式以及它們之間的區(qū)別。還包含幾個(gè)示例來更清楚地解釋這個(gè)概念。接下來,我們將解釋如何在 Python 編程中使用多行語句和縮進(jìn),需要的朋友可以參考一下
    2021-09-09
  • 深入了解Python?Opencv數(shù)據(jù)增強(qiáng)

    深入了解Python?Opencv數(shù)據(jù)增強(qiáng)

    常見的數(shù)據(jù)增強(qiáng)操作有:按比例放大或縮小圖片、旋轉(zhuǎn)、平移、水平翻轉(zhuǎn)、改變圖像通道等。本文將通過Python?OpenCV實(shí)現(xiàn)這些操作,需要的可以參考一下
    2022-02-02

最新評(píng)論