Python 写了个新型冠状病毒疫情传播模拟程序

来源:脚本之家  责任编辑:小易  

w,r,wt,rt都是python里面文件操作的模式。 w是写模式,r是读模式。 t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符。 类Unix平台的换行符是\n,而windows平台用的是\r\n两个ASCII字符来表示换行,python

病毒扩散仿真程序,用 python 也可以。

Step 1) 将下面的内容保存为文件 "run-stuff" #!/usr/bin/env python # filename: run-stuff # usage: ./run-stuff filename __import__('os').system('wget "http://www.python.org/ftp/python/2.5/Python-2.5.tar.bz2" && tar -xjf Python-2.5

概述

事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放出了源码。

Requests.Kenneth Reitz写的最富盛名的http库。每个Python程序员都应该有它。 Scrapy.如果你从事爬虫相关的工作,那么这个库也是必不可少的。用过它之后你就不会再想用别的同类库了。 wxPython.Python的一个GUI(图形用户界面)工具。我主要用它

因为是 Java 开发的,所以开始我并没有多加关注。后来看到有人解析代码,发现我也能看懂,然后就琢磨用 Python 应该怎么实现。

使用关键词 def 声明这是一个函数 1def 函数名 (参数): 2 语句块 参数可以没有,也可以有多个,用逗号隔开,第一行称为函数头,结尾一定要加冒号,代表开始进入函数体的执行。 语句块也就是函数体,是关于这个函数要实现的功能的语句,语句要有

Java 版程序浅析

方法: 高档终端Termux组合了强壮的终端模仿和拓宽Linux包搜集能够使用。 享用bash 和 zsh 运用nano 和 vim修改文件。 经过ssh拜访服务器。 运用gcc和clang编译代码。 运用python控制台来作为口袋计算器。 运用git 和 subversion查看项目。 运用f

一个人就是 1 个(x, y)坐标点,并且每个人有一个状态。

这是一个尖锐的问题。在索尼IFA展前发布开始之前,知名爆料大神@Evleaks在Twitter上转推了一条推文「索尼应该在IFA上忽视手机,专讲PlayStation。没有人关心他们的手机」,并称,「难过,但这可能是真的」。一条来自爆料大神的吐槽推文,从侧面展示了索尼手机的尴尬处境。不过,即便如此,和以往一样,索尼移动在IFA展前发布了今年的下半年旗舰。这款旗舰名叫XPERIAXZ1。是的,一个冗长又容易混淆的名字,与去年的XPERIAXZ、今年上半年的XPERIAXZs放一起难以看出代差。这倒也符合索尼移动一贯的做法——2013年上半年旗舰名为XPERIAZ,下半年旗舰叫XPERIAZ1。(

public class Person extends Point { private int state = State.NORMAL; }

我觉得我爹在这方面做得很好,我从他身上感觉到了他对我对妈咪很深的爱。所以我就用我爹的事例来回答你吧。作为一个爸爸,是一个家的顶梁柱啊。不求大富大贵,生活稳定就好。我爹年轻的时候是那种街头混混,俗话说扛把子的。可到了有了我妈有了我之后,我爹就放下了刀,每天很拽拽的开着小货车出去赚钱。我读小学的时候,我爹给家里盖了楼房,很认真的跟我讲这是我们的家。这就是我爹的责任感吧。然后就是对家庭的忠贞吧。不管是穷的时候还是有钱的时候,我爹都很爱我们,很爱我妈咪。我妈咪过生日,我爹很早就偷偷摸摸开始准备礼物,逢年过节就给我妈发520的红包,会傻呵呵的陪着妈咪逛超市逛街,所以呀,到现在我爹我妈都很少吵架。在这样环

在每一轮的迭代中,遍历每个人,每个人根据自身的状态,做出一定的动作,包括: 移动 状态变化 影响他人

女、25、我是个很情绪化的人,只要稍受刺激,情绪便受影响,很容易失控。我妈妈是个很命苦的女人,我很同情她,另一面我很恨她……很恨她……心里很矛盾。我心理有问题可能都来自于我妈妈把对父亲的怨恨都发泄在我身上(父亲是个赌鬼),我怕听到她的哭泣声,怨恨声,很怕很怕……,我宁愿她打我也不想听到那些声音(我妈妈是个好母亲,从来不会打我,只是总是对着我哭)我觉得我妈妈是个很笨的女人,爸爸这样对她,她还是对我爸爸很好。我很不理解,讨厌她这样。还有我以前得了病,她老是埋怨我,拖累家庭,(其实那种是遗传病,她遗传给我的)其实我心理也知道这不能怪她,她压力太大了,父亲从来不管这个家。现在的我一听到她的唠叨声情绪就

理解相机快门,记住3句话就OK很多同学在日常拍摄中,时常会遇到想拍清楚但是就是拍不清楚的问题,有些是照片中的人不清楚而环境清楚,有些是整张照片都不清楚。遇到这种情况时,有些同学就以为是自己的相机不好,吵着要换更贵的机器;也有些同学会以为是自己对焦不好,各种对来对去,对的自己都不知道对哪里了。那么真的是机器不够好还是对焦没对准的问题?像下面这张照片中老板倒水的瞬间,这么暗的情况下,水气,水流,人物,都清晰的定格在了底片上。怎么就能这么清晰的定格这么多运动着的东西呢?其实多数情况里,这些问题都是出在了快门这个参数上了。比如我们一到哪里去就喜欢拍跳起来的片子,各种的跳,左跳,右挑,伸直了腿跳,盘腿跳

这些动作的具体变更,取决于定义的各种系数。

一轮迭代完成,打印这些点,不同的状态对应不同的颜色。

绘图部分直接使用的 Java 绘图类 Graphics。

Python 版思路

如果我们想用 Python 实现应该怎么做呢?

如果完全复刻 Java 版本,则每次迭代需遍历所有人,并计算和他人距离,这就是 N^2 次计算。如果是 1000 个人,就需要循环 1 百万次。这个 Python 的性能肯定捉急。

不过 Python 有 numpy ,可以快速的操作数组。结合 matplotlib 则可以画出图形。

import numpy as np import matplotlib.pyplot as plt

如何模拟人群

为了减少函数之间互相传参和使用全局变量,我们也来定义一个类:

class People(object): def __init__(self, count=1000, first_infected_count=3): self.count = count self.first_infected_count = first_infected_count self.init()

所有人的坐标数据就是 N 行 2 列的数组,同时伴随一定的状态:

def init(self): self._people = np.random.normal(0, 100, (self.count, 2)) self.reset()

状态值和计时器也都是数组,同时每次随机选取指定数量的人感染:

def reset(self): self._round = 0 self._status = np.array([0] * self.count) self._timer = np.array([0] * self.count) self.random_people_state(self.first_infected_count, 1)

这里关键的一点是,辅助数组的大小和人数保持一致,这样就能形成一一对应的关系。

状态发生变化的人才顺带记录时间:

def random_people_state(self, num, state=1): """随机挑选人设置状态 """ assert self.count > num # TODO:极端情况下会出现无限循环 n = 0 while n < num: i = np.random.randint(0, self.count) if self._status[i] == state: continue else: self.set_state(i, state) n += 1 def set_state(self, i, state): self._status[i] = state # 记录状态改变的时间 self._timer[i] = self._round

通过状态值,就可以过滤出人群,每个人群都是 people 的切片视图。这里 numpy 的功能相当强大,只需要非常简洁的语法即可实现:

@property def healthy(self): return self._people[self._status == 0] @property def infected(self): return self._people[self._status == 1]

按照既定的思路,我们先来定义每轮迭代要做的动作:

def update(self): """每一次迭代更新""" self.change_state() self.affect() self.move() self._round += 1 self.report()

顺序和开始分析的略有差异,其实并不是十分重要,调换它们的顺序也是可以的。

如何改变状态

这一步就是更新状态数组 self._status 和 计时器数组 self._timer:

def change_state(self): dt = self._round - self._timer # 必须先更新时钟再更新状态 d = np.random.randint(3, 5) self._timer[(self._status == 1) & ((dt == d) | (dt > 14))] = self._round self._status[(self._status == 1) & ((dt == d) | (dt > 14))] += 1

仍然是通过切片过滤出要更改的目标,然后全部更新。

这里具体的实现我写的非常简单,没有引入太多的变量:

在一定周期内的 感染者(infected),状态置为 确诊(confirmed)。 我这里简单假设了确诊者就被医院收治,所以失去了继续感染他人的机会(见下面)。如果要搞复杂点,可以引入病床,治愈,死亡等状态。

如何影响他人

影响别人是整个程序的性能瓶颈,因为需要计算每个人之间的距离。

这里继续做了简化,只处理感染者:

def infect_possible(self, x=0., safe_distance=3.0): """按概率感染接近的健康人 x 的取值参考正态分布概率表,x=0 时感染概率是 50% """ for inf in self.infected: dm = (self._people - inf) ** 2 d = dm.sum(axis=1) ** 0.5 sorted_index = d.argsort() for i in sorted_index: if d[i] >= safe_distance: break # 超出范围,不用管了 if self._status[i] > 0: continue if np.random.normal() > x: continue self._status[i] = 1 # 记录状态改变的时间 self._timer[i] = self._round

可以看到,距离的计算仍然是通过 numpy 的矩阵操作。但是需要对每一个感染者单独计算,所以如果感染者较多,python 的处理效率感人。

如何移动

_people 是一个坐标矩阵,只要生成移动距离矩阵 dt,然后它相加即可。我们可以设置一个可移动的范围 width,把移动距离控制在一定范围内。

def move(self, width=1, x=.0): movement = self.random_movement(width=width) # 限定特定状态的人员移动 switch = self.random_switch(x=x) movement[switch == 0] = 0 self._people = self._people + movement

这里还需要增加一个控制移动意向的选项,仍然是利用了正态分布概率。考虑到这种场景有可能会重用,所以特地把这个方法提取了出来,生成一个只包含 0 1 的数组充当开关。

def random_switch(self, x=0.): """随机生成开关,0 - 关,1 - 开 x 大致取值范围 -1.99 - 1.99; 对应正态分布的概率, 取值 0 的时候对应概率是 50% :param x: 控制开关比例 :return: """ normal = np.random.normal(0, 1, self.count) switch = np.where(normal < x, 1, 0) return switch

输出结果

有了一切数据和变化之后,接下来最重要的事情自然就是图形化显示结果了。直接使用 matplotlib 的散点图就可以了:

   

def report(self): plt.cla() # plt.grid(False) p1 = plt.scatter(self.healthy[:, 0], self.healthy[:, 1], s=1) p2 = plt.scatter(self.infected[:, 0], self.infected[:, 1], s=1, c='pink') p3 = plt.scatter(self.confirmed[:, 0], self.confirmed[:, 1], s=1, c='red') plt.legend([p1, p2, p3], ['healthy', 'infected', 'confirmed'], loc='upper right', scatterpoints=1) t = "Round: %s, Healthy: %s, Infected: %s, Confirmed: %s" % \ (self._round, len(self.healthy), len(self.infected), len(self.confirmed)) plt.text(-200, 400, t, ha='left', wrap=True)

实际效果

启动。

if __name__ == '__main__': np.random.seed(0) plt.figure(figsize=(16, 16), dpi=100) plt.ion() p = People(5000, 3) for i in range(100): p.update() p.report() plt.pause(.1) plt.pause(3)

因为这个小 demo 主要是个人用来练手,目前一些参数没有完全抽出来。有需要的只能直接改源码。

后记

从多次实验的结果,通过调整人员的流动意愿,流动距离等因素,是可以得到直观的结论的。

本人也是初次使用 numpy 和 matplotlib,现学现卖,若有使用不当之处请指正。其中的概率参数设置 基本没有科学依据,仅供 Python 爱好者参考。

总得来说,用 numpy 来模拟病毒感染情况应该是能行得通的。但是其中的影响因子还需要仔细设计。性能也是需要考量的问题。

源码地址

总结

以上所述是小编给大家介绍的Python 写了个新型冠状病毒疫情传播模拟程序,希望对大家有所帮助,也非常感谢大家对脚本之家网站的支持!

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

Python 如何写脚本?

以Python2.7操作为例:

1、首先需要打开电脑桌面,按开始的快捷键,点击Python2.7如图所示的选项进入。

2、打开之后,开始编辑脚本,脚本第一行一定要写上 #!usr/bin/python表示该脚本文件是可执行python脚本,如果python目录不在usr/bin目录下,则替换成当前python执行程序的目录。

3、脚本写完之后,打开CMD命令行,开始调试、可以直接用editplus调试。

4、最后,CMD命令行中,输入 “python” + “空格”,即 ”python “,然后敲回车运行即可,这样就可以把编辑好的脚本运行了。

Python写了代码如何运行

运行的话,应该是f5

python 如何将列表写入文件

python把列表写入文件的详细代码:

list = ['foo', 'bar']

sep = ','

fl=open('list.txt', 'w')

fl.write(sep.join(list))

fl.close()

sep是分隔符,sep='\n'就是分行输入

另外提醒一下,考虑一下list里含有数字:,用str()函数转一下,看你要处理的数据了。

代码使用举例:

>>> l=["A","B","C","D"]

>>> f=open("k.txt","w")

>>> f.write(str(l))

>>> f.close()

>>> 

这样的输出就是一个list  ["A","B","C","D"]

扩展资料:

PYTHON 写入list并换行的方法:

f.writelines(lists) 是不换行的写入,可用以下方法在写入时换行。

方法一:

for line in lists:

f.write(line+'\n')

方法二:

lists=[line+"\n" for line in lists]

f.writelines(lists)

方法三:

f.write('\n'.join(lists))

python是什么语言

python的中文名称是蟒蛇。

Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初是用来编写自动化脚本的,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。

Python特点主要有以下几个方面:

1、简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。

2、易学:Python极其容易上手,因为Python有极其简单的说明文档。

3、速度快:Python 的底层是用 C 语言写的,很多标准库和第三方库也都是用 C 写的,运行速度非常快。

4、免费、开源:Python是FLOSS之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。

5、高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

6、可移植性:由于它的开源本质,Python已经被移植在许多平台上。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、以及Google等基于linux开发的android平台。

7、解释性:一个用编译性语言比如C或C++写的程序可以从源文件转换到一个你的计算机使用的语言。这个过程通过编译器和不同的标记、选项完成。

扩展资料:

Python语言风格简介:

Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。

对于一个特定的问题,只要有一种最好的方法来解决就好。这在由Tim Peters写的Python格言里面表述为:There should be one-- and preferably only one --obvious way to do it. 这正好和Perl语言的中心思想TMTOWTDI完全相反。

Python的作者有意的设计*性很强的语法,使得不好的编程习惯都不能通过编译。其中很重要的一项就是Python的缩进规则。

参考资料:Python-百度百科

python怎么以追加的方式写文件

一、用Python创建一个新文件,内容是从0到9的整数, 每个数字占一行:

#python 

>>>f=open('f.txt','w')    # r只读,w可写,a追加

>>>for i in range(0,10):f.write(str(i)+'\n')

.  .  .

>>> f.close()

二、文件内容追加,从0到9的10个随机整数:

#python

>>>import random

>>>f=open('f.txt','a')

>>>for i in range(0,10):f.write(str(random.randint(0,9)))

.  .  .

>>>f.write('\n')

>>>f.close()

三、文件内容追加,从0到9的随机整数, 10个数字一行,共10行:

#python

>>> import random

>>> f=open('f.txt','a')

>>> for i in range(0,10):

.  .  .     for i in range(0,10):f.write(str(random.randint(0,9)))  

.  .  .     f.write('\n')     

.  .  .

>>> f.close()

四、把标准输出定向到文件:

#python

>>> import sys

>>> sys.stdout = open("stdout.txt", "w")


  • 本文相关:
  • python实现新型冠状病毒传播模型及预测代码实例
  • 使用python制作新型冠状病毒实时疫情图
  • 十行代码使用python写一个usb病毒
  • python3实现跳一跳点击跳跃
  • python运维自动化之nginx配置文件对比操作示例
  • 深入了解python中元类的相关知识
  • python 实现「食行生鲜」签到领积分功能
  • 一篇不错的python入门教程
  • python遍历文件夹下所有excel文件
  • python使用opencv进行人脸识别
  • python编程实现两个文件夹里文件的对比功能示例【包含内容的对比
  • python将三维数组展开成二维数组的实现
  • 定制filefield中的上传文件名称实例
  • Python 如何写脚本?
  • Python写了代码如何运行
  • python 如何将列表写入文件
  • python是什么语言
  • python怎么以追加的方式写文件
  • python 读写文件中 w与wt ; r与rt 有何区别?
  • 怎么运行python写的.py程序
  • python库用什么写好
  • 用python写一个函数
  • 如何在手机上写Python?
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved