Python 纽约市的建模和地图显示:病毒模拟

Python 纽约市的建模和地图显示:病毒模拟,python,matplotlib,Python,Matplotlib,所以我完成了代码的编写,以显示纽约地图的图像,应该是这样的 但根据我现有的代码: import random import string import math from matplotlib import pyplot as plt def normpdf(x, mean, sd): """ Return the value of the normal distribution with the specified mean and standard deviation (sd) at

所以我完成了代码的编写,以显示纽约地图的图像,应该是这样的

但根据我现有的代码:

import random
import string
import math
from matplotlib import pyplot as plt

def normpdf(x, mean, sd):
"""
Return the value of the normal distribution 
with the specified mean and standard deviation (sd) at
position x.
You do not have to understand how this function works exactly. 
"""
var = float(sd)**2
denom = (2*math.pi*var)**.5
num = math.exp(-(float(x)-float(mean))**2/(2*var))
return num/denom


recovery_time = 4 # recovery time in time-steps
virality = 0.2    # probability that a neighbor cell is infected in 
              # each time step                                                  

class Cell(object):

    def __init__(self,x, y):
        self.x = x
        self.y = y 
        self.state = "S" # can be "S" (susceptible), "R" (resistant = dead), or 
                     # "I" (infected)

    def infect(self):
    pass

class Map(object):
    cells_list = []

    def __init__(self):
        self.height = 150
        self.width = 150           
        self.cells = {}

    def add_cell(self, cell):
        self.cells_list.append((cell.x, cell.y))
        self.cells_list.append(cell.state)



    def display(self):
        colors = []
        for y in range(150):
            for x in range(150):
                if (x, y) in self.cells:
                    if self.cells[(x,y)] in "S":
                        colors.append((0.0,1.0, 0.0))
                    elif self.cells[(x, y)] in "R":
                        colors.append((0.5, 0.5, 0.5))
                    else:
                        colors.append((1.0, 0.0, 0.0))
                else:
                    colors.append((0.0,0.0,0.0))
        plt.imshow(colors)

def adjacent_cells(self, x,y):
    pass


def read_map(filename):
    m = Map()
    coordinates = open(filename, 'r')
    coordinates_list = coordinates.readlines()
    for l in coordinates_list:
        line = l.strip()
        split_coords = line.split(',')
        c = Cell(split_coords[0], split_coords[1])
        m.add_cell(c)

  # ... Write this function

   return m

 read_map('nyc_map.txt').display()
我得到了这个图像:


顺便说一下,我们的地图是150 x 150的网格;要创建图像,我必须使用列表列表,您的代码有很多错误:

  • 几个缩进错误
  • colors
    是一个长度为3的150*150元组列表,但是
    imshow
    的输入应该是一个大小为150150,3的数组
  • “S”中的
    self.cells[(x,y)]检查
    self.cells[(x,y)]
    的内容是否包含在字符串
    “S”
    中,只有当
    self.cells[(x,y)]==“S”
    时,该值才能为真
    self.cells
    {}
    初始化,并且从不在其他地方设置,因此条件始终为false
  • self.cells[(x,y)]
    要求
    x
    y
    为整数,但是
    Cell(拆分坐标[0],拆分坐标[1])
    在创建单元格时使用字符串
以下是一个已删除所有代码的固定版本,该示例不需要这些代码:

from matplotlib import pyplot as plt
import numpy as np

class Cell(object):

    def __init__(self,x, y):
        self.x = x
        self.y = y
        self.state = "S" # can be "S" (susceptible), "R" (resistant = dead), or
                     # "I" (infected)

class Map(object):

    def __init__(self):
        self.cells = {}

    def add_cell(self, cell):
        self.cells[(cell.x, cell.y)] = cell.state

    def display(self):
        colors = np.zeros((150,150,3))
        for y in range(150):
            for x in range(150):
                if (x, y) in self.cells:
                    if self.cells[(x,y)] == "S":
                        colors[x,y,:] = (0.0,1.0, 0.0)
                else:
                    colors[x, y, :] = (0.0,0.0,0.0)

        plt.imshow(colors)
        plt.show()

def read_map(filename):
    m = Map()
    coordinates = open(filename, 'r')
    coordinates_list = coordinates.readlines()
    for l in coordinates_list:
        line = l.strip()
        split_coords = line.split(',')
        c = Cell(int(split_coords[0]), int(split_coords[1]))
        m.add_cell(c)

    # ... Write this function

    return m

read_map('nyc_map.txt').display()

谢谢你花时间帮我找出哪里出了问题!