2019年1月25日金曜日

開発環境

エレガントなSciPy (Juan Nunez-Iglesias (著)、Stéfan van der Walt(著)、Harriet Dashnow(著)、山崎 邦子(翻訳)、山崎 康宏(翻訳)、オライリージャパン)の3章(ndimageを使った画像領域のネットワーク)、3.4(汎用フィルタ: 近傍データの任意の関数)、3.4.1(演習: Conwayのライフゲーム)の解答を求めてみる。

コード

Python 3

#!/usr/bin/env python3
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
from PIL import Image
import io


def conway_filter(cells):
    cell = cells[len(cells) // 2]
    neibors = np.sum(cells) - cell
    if cell == 1:
        if neibors <= 1:
            return 0
        elif 2 <= neibors <= 3:
            return 1
        else:
            return 0
    if cell == 0:
        if neibors == 3:
            return 1
        else:
            return 0


def next_generation(array: np.array) -> np.array:
    return ndimage.generic_filter(array, conway_filter, size=3)


if __name__ == '__main__':
    for i in range(3):
        print(f'conway_{i}.gif')
        array = np.random.randint(2, size=(100, 100))
        plt.imsave(f'conway_{i}.png', array)
        n = 3 * 60 * 2
        buffers = [io.BytesIO() for _ in range(n)]
        for j in range(n):
            array = next_generation(array)
            plt.imsave(buffers[j], array)
        im = Image.open(f'conway_{i}.png')
        im.save(f'conway_{i}.gif', save_all=True,
                append_images=[Image.open(buffers[i]) for i in range(n)],
                duration=500)

入出力結果(cmd(コマンドプロンプト)、Terminal、Jupyter(IPython))

$ python3 sample2.py
conway_0.gif
conway_1.gif
conway_2.gif
$

0 コメント:

コメントを投稿