qq_35178952 2019-05-25 16:16 采纳率: 50%
浏览 555
已结题

求python大神讲解一下各个函数的意思,拜谢

大佬们,求解这个程序的每个function是啥意思,我实在是看不太懂……
事情是这样的,我们老师要我们写一个关于疾病传播的程序,用的是python,然后她给了一个代码给我们

from neighbour import von_neumann
import numpy as np
import matplotlib.pyplot as plt
import random

def distribute(grid, num_r, num_c, numpeep):
    for i in range(numpeep):
        rpos = random.randint(0, num_r-1)
        cpos = random.randint(0, num_c-1)
        grid[rpos, cpos] += 1

def makeScatter(grid, num_r, num_c):
    r_values = []
    c_values = []
    count_values = []
    for row in range(num_r):
        for col in range(num_c):
            if grid[row,col] > 0:
                r_values.append(row)
                c_values.append(col)
                count_values.append(grid[row,col]*100)
    return(r_values, c_values, count_values)

def displayGrid(grid, num_r, num_c):
    for row in range(num_r-1, -1, -1):
        for col in range(num_c):
            print(grid[row,col], end=" ")
        print()

def plotGrids():
    plt.figure(figsize = (7,7))
    Irows, Icols, Icount = makeScatter(infected, NUM_ROWS, NUM_COLS)
    plt.scatter(Icols, Irows, s=Icount, c="r", alpha=0.5)
    Urows, Ucols, Ucount = makeScatter(uninfected, NUM_ROWS, NUM_COLS)
    plt.scatter(Ucols, Urows, s=Ucount, c="b", alpha=0.5)
    plt.show()

def movePeeps(cur, next, r, c):
    for peep in range(cur[r,c]):
         rMove = random.randint(-1,1)
         cMove = random.randint(-1,1)
         if (r + rMove) > (NUM_ROWS-1) or (r + rMove) < 0:
             rMove = 0
         if (c + cMove) > (NUM_COLS-1) or (c + cMove) < 0:
             cMove = 0   
         next[r + rMove, c + cMove] +=1

def infect(inf, notinf, r, c, prob):
    prob = prob * inf[r,c]
    if prob:
        for peep in range(notinf[r,c]):
            if random.random() < prob:
                inf[r, c] +=1
                notinf[r, c] -=1
                print("***** New infection (", r, ",", c, ")")


INIT_POP = 100
INIT_INFECTED = 5
INIT_DEAD = 0
NUM_COLS = 15
NUM_ROWS = 10
NUM_STEPS = 10

infected = np.zeros((NUM_ROWS, NUM_COLS), dtype=np.int)
uninfected = np.zeros((NUM_ROWS, NUM_COLS), dtype=np.int)

distribute(infected, NUM_ROWS, NUM_COLS, INIT_INFECTED)
distribute(uninfected, NUM_ROWS, NUM_COLS, INIT_POP)

displayGrid(infected, NUM_ROWS, NUM_COLS)
print()
displayGrid(uninfected, NUM_ROWS, NUM_COLS)

plotGrids()

for timestep in range(NUM_STEPS):
    print("\n###################### TIMESTEP", timestep, "#####################\n")
    infected2 = np.zeros((NUM_ROWS, NUM_COLS), dtype=np.int)
    uninfected2 = np.zeros((NUM_ROWS, NUM_COLS), dtype=np.int)
    for row in range(NUM_ROWS):
        for col in range(NUM_COLS):
            infect(infected, uninfected, row, col, 0.5)
            movePeeps(infected, infected2, row, col)
            movePeeps(uninfected, uninfected2, row, col)
    infected = infected2
    uninfected = uninfected2
    plotGrids()

print("Done")

她的作业要起我们添加死亡人数,康复人数,并且用画图的形式表现出来,但是第一步我就卡住了,根本看不懂她的这一串代码是啥。。
求大神详解这些函数是什么意思。
对了,她还要求我们用Moore或者Von_neumann的函数来作为传播的方式,那个我已经写好了,但是不知道该怎么用进来……

#von neumann method is to infect patients for 4 directions:
#north, south, west, east
#
def von_neumann(table):
    von_neumann_method = []
    for (x,y) in table:
        von_neumann_method.append((x,y))  # it is the causative agent
        von_neumann_method.append((x-1,y))
        von_neumann_method.append((x,y-1))
        von_neumann_method.append((x+1,y))
        von_neumann_method.append((x,y+1))
    return von_neumann_method

求大神啊,不求讲怎么做这个作业,只求讲解一下这些是什么意思就好了……

  • 写回答

1条回答 默认 最新

  • a81836620 2019-05-26 21:27
    关注

    def distribute(grid, num_r, num_c, numpeep): #给grid矩阵填充值
    for i in range(numpeep): #填充numpeep个值
    rpos = random.randint(0, num_r-1) #随机生成一个0到num_r的整数
    cpos = random.randint(0, num_c-1) #随机生成一个0到num_c的整数
    grid[rpos, cpos] += 1 #将生成数作为坐标,将矩阵grid对应值+1

    def makeScatter(grid, num_r, num_c): #遍历矩阵grid的num_r行num_c列,如果某个点值大于0,则将对应行列数放入两个列表r_values, c_values,并将值*100放入列表count_values
    r_values = []
    c_values = []
    count_values = []
    for row in range(num_r):
    for col in range(num_c):
    if grid[row,col] > 0:
    r_values.append(row)
    c_values.append(col)
    count_values.append(grid[row,col]*100)
    return(r_values, c_values, count_values)

    def displayGrid(grid, num_r, num_c): #将矩阵grid输出
    for row in range(num_r-1, -1, -1):
    for col in range(num_c):
    print(grid[row,col], end=" ")
    print()

    def plotGrids(): # 输出一个7*7矩阵,并用makeScatter统计的r_values, c_values在上面画线段,并用图片显示出来
    plt.figure(figsize = (7,7))
    Irows, Icols, Icount = makeScatter(infected, NUM_ROWS, NUM_COLS)
    plt.scatter(Icols, Irows, s=Icount, c="r", alpha=0.5)
    Urows, Ucols, Ucount = makeScatter(uninfected, NUM_ROWS, NUM_COLS)
    plt.scatter(Ucols, Urows, s=Ucount, c="b", alpha=0.5)
    plt.show()

    评论

报告相同问题?

悬赏问题

  • ¥30 vmware exsi重置后的密码
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面