首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python入门与进阶之NumPy库应用——元胞自动机

1

旅行居家必备之利器 NumPy

Numpy的名字来源于Numerical & Python。

作为功能强大的 Python 库可谓是 Python 进行科学计算,数据分析的旅行居家必备之利器(大雾),主要用于提供,存储,计算 N 维数组, 它可以完成诸如机器学习模型,图像处理和一些数学任务。

本次笔者分享的是通过例子介绍一下 NumPy 在机器学习和图像处理方面的应用:元胞自动机模型(谈到图像处理我们不可避免要涉及 matplotlib 这个库不过不是今天的重点噢)。

2

元胞自动机模型

为什么是元胞自动机模型的 NumPy 库实现呢?

原因是笔者某天逛知乎的时候发现了一个关于生物进化的话题然后就有一群对于无神论的质疑者和无神论的答主进行愉(并)快(不)的激烈(si)探讨(bi),然后关于当他们聊(撕)到“进化论如何解释生命的出现”又出现了“复杂有秩序的系统不可能是自发产生的,一定是被设计出来”的质疑。

于是呢,打脸神器网格动力学模型元胞自动机模型就被答主搬出来了,因为元胞自动机模型又有一个名称叫做“生命游戏(Game of Life)”。

那个问题叫做“人类有没有可能是被设计出来的“,感(想)兴(吃)趣(瓜)的同学可以移步知乎~

下面我们介绍一下元胞自动机模型

Conway's Game of Life 是由英国数学家约翰·霍顿·康威在1970年发明的一种细胞自动机,该游戏的演化由初始状态决定,不需要进一步的输入。

生命游戏的宇宙是一个由正方形细胞组成的无限的二维正交网格,每个细胞都处于两种可能状态中的一种,生存或死亡。每个单元格与它的八个相邻单元格相互作用,这八个相邻单元格是水平、垂直或对角相邻的。(即九宫格)

每个时间点下存在以下的变化:

1. 原状态 alive, 周围 alive 细胞数

2. 原状态 alive, 周围 alive 细胞 = 2 or 3, lives.

3. 原状态 alive, 周围 alive 细胞数 > 3, dies.

4. 原状态 dead, 周围 alive 细胞数 = 3, lives.

最初的模式构成了系统的 seed。第一代是通过对 seeds 中的每个细胞同时应用上述规则创建的; births 和 deaths 是同时发生的。每一代都是前一代的纯函数。这些规则继续被重复应用以创建更多代。

刚开始细胞的变化都是杂乱无序的,但是经过一段时间的演变之后开始产生稳定规律的变化。

我们先来感受一下这个“生命游戏”

有没有很震惊~然鹅这样复杂的图像怎么可能用 NumPy 实现???别忘啦,NumPy 是专门处理高维数组的哦,这样网格动力学撑死二维而已肯定是小菜一碟啦~

3

代码详解

第一步我们先 import 各种包,numpy 用于计算,matplotlib 用于绘图,argparse 有两个作用:一个是定义应该如何解析一个命令行参数,另一个是如果命令行中没有出现该参数时的默认值。下面原作者给出了 argparse 的用法示例。

接下来我们创建初始模式 seeds,这些模式是根据它们的行为来分类的。常见的模式类型包括:Still lifes,不随世代变化;Oscillators,在有限的几代后回到初始状态;Spaceships,它们会在网格中移动。这里是用字典(key - value)进行定义:key - name, value - array,方便后面通过key对seed进行调用。

(Diehard. 图片来源: Wikipedia - Conway's Game of Life)

敲黑板,看重点啦,这里 def survival 定义了每个时间点下的四个变化规则,来判断一个细胞是否存活:dead 返回0,alive 返回 1,这段代码是不是写的特别简洁漂亮?

其中(x,y)表示cell在universe里的坐标;universe[x-1:x+2,y-1:y-2] 是对 array 的切片(Slicing),得到cell为中心的九宫格(3×3),类型是 np.ndarray;np.sum 计算了九宫格中cells的存活个数。下面是一个数组切片的栗子:

两个循环遍历整个universe,[0]是第二维长度,[1]是第一维长度,这样确保每一个cell都被应用了前面定义的4个规则,并在每一次迭代里都返回了已更新的universe of cells。

这里有一个不是重点的重点,np.copy() 是 deep copy,指的是复制完新的数组和原来的数组没有任何关系,在新的数组上做任何改动 (type, value) 都不会影响原来的数组。

定义可视化函数,笔者已经对每行代码做了注释~

出图啦

4

复现的 Tips

然鹅呢,笔者当时在复现这个代码时可视化出现了一点小问题,笔者第一反应是包的路径出了问题,鼓捣了一下午,放弃了GIF格式尝试以MP4格式出图成功,以下是解决方法:

1. 请各位立刻马上放弃使用 PyCharm 出图,Anaconda 对于这个栗子更加友好

2.下载 ffmpeg, 在环境变量新增一个 path

3. 原代码里gif改成mp4,writer = imagemagick改成ffmpeg

( 新版 imagmagick 没有 convert.exe.....所以 Google 到的 imagegick 解决方法除了 copy 旧版 convert.exe 到目录下再改变路径,显然超级麻烦,pass)

4. 再把matplotlib包里resetup文件中的 animation.ffmpeg_path 改成 ffmpeg 的路径就 OK 啦~

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190127B0SF0V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券