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

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

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

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

在20世紀(jì)70年代,一種名為生命游戲的二維細(xì)胞自動機(jī)變得廣為人知,特別是在早期的計算機(jī)界。由約翰 · 康威發(fā)明,馬丁 · 加德納在《科學(xué)美國人》的一篇文章中推廣,其規(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ì)胞在有兩到三個活鄰居時能活到下一代,否則死亡。任何有三個活鄰居的死細(xì)胞會變成活細(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ì)胞自動機(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]
            # 任何有三個活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個活鄰居的活細(xì)胞都能活到下一代,否則就會死亡。
            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動畫

基于此我們可以制作matplotlib的動畫,下面直接將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]
            # 任何有三個活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個活鄰居的活細(xì)胞都能活到下一代,否則就會死亡。
            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動畫

另一種創(chuàng)建matplotlib動畫的方法是使用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]
            # 任何有三個活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個活鄰居的活細(xì)胞都能活到下一代,否則就會死亡。
            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ǎo)出html文件:

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

還可以保存MP4視頻:

anim.save("out.mp4")

或gif動畫:

anim.save("out.gif")

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

ffmpeg下載地址:

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

隨機(jī)生命游戲

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

完整代碼如下:

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]
            # 任何有三個活鄰居的死細(xì)胞都變成了活細(xì)胞,繁殖一樣。
            if universe[x, y] == 0 and neighbor_num == 3:
                universe_new[x, y] = 1
            # 任何有兩到三個活鄰居的活細(xì)胞都能活到下一代,否則就會死亡。
            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個點作為初始活細(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實現(xiàn)的matplotlib動畫演示之細(xì)胞自動機(jī)的文章就介紹到這了,更多相關(guān)python  matplotlib動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • simple-pytest?框架使用教程

    simple-pytest?框架使用教程

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

    Python中的CURL PycURL使用例子

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    本篇文章將會使大家了解Python 語句、表達(dá)式以及它們之間的區(qū)別。還包含幾個示例來更清楚地解釋這個概念。接下來,我們將解釋如何在 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實現(xiàn)這些操作,需要的可以參考一下
    2022-02-02

最新評論