Numpy中无法存储多次模拟结果,仅保留最后一次数据的问题
问题分析与解决方法
核心问题定位
你的代码里,每次模拟循环内执行pandemiclength2 = numpy.append(pandemiclength1, day),但pandemiclength1在循环过程中始终是初始的空列表,而且pandemiclength1 = pandemiclength2是放在最外层循环外面的,这就导致每次循环都只是把当前的day追加到空列表里,最后只剩最后一次模拟的结果。
修复方案
方法一:用列表收集结果(高效且适合新手)
numpy数组每次追加会重新分配内存,小数据量没问题,但先通过普通列表收集所有结果,最后转成numpy数组更高效:
- 初始化空列表
pandemic_lengths = [] - 每次模拟结束后,把当前的
day追加到列表:pandemic_lengths.append(day) - 所有模拟完成后,转成numpy数组:
pandemic_lengths_np = numpy.array(pandemic_lengths)
方法二:修复numpy数组追加逻辑
如果坚持用numpy数组,要确保每次追加是基于上一次的结果:
- 初始化
pandemiclength = numpy.array([]) - 每次模拟结束后执行:
pandemiclength = numpy.append(pandemiclength, day),这样每次都是在已有数组后追加新值。
修改后的完整代码示例(方法一)
import numpy # 模拟次数 simulation_times = 3 pandemic_lengths = [] # 循环执行模拟 for _ in range(simulation_times): # 变量初始化 day = 0 p = 0.01 infected = 0 daysinfected = numpy.zeros(60) z = 0 # 第0天模拟 print(' ') print('==========================') print("DAY: 0") print('==========================') result = numpy.random.binomial(1, p, 60) print(result) for ele in result: if ele == 1: infected += 1 print("Number Infected:", infected) daysinfected = numpy.where(result == 1, 3, 0) print("Days Infected") print(daysinfected) # 后续天数循环,直到无感染者 while infected > 0: day += 1 print(' ') print('==========================') print("DAY:", day) print('==========================') # 更新每个个体的剩余感染天数 daysinfected = numpy.where(daysinfected > 0, daysinfected - 1, 0) # 为康复者设置免疫标记 for i in range(len(daysinfected)): if result[i] == 1 and daysinfected[i] == 0: result[i] = -1 infected -= z print("Children Infected at Start of Day:", infected) # 模拟当天的感染传播 for i in range(infected): print("---trial", i, "---") new_values = numpy.random.binomial(1, p, 60) result = numpy.where(result == 0, new_values, result) infected = 0 for ele in result: if ele == 1: infected += 1 # 为新感染者设置感染天数 for i in range(len(daysinfected)): if result[i] == 1 and daysinfected[i] == 0: daysinfected[i] = 3 print(result) print("Number Infected:", infected) print("Days Infected") print(daysinfected) z = numpy.count_nonzero(daysinfected == 1) print("Totalabouttoflip", z) print("Total Infected at End of", day, "days is", infected) print("Days Infected - less 1") print(daysinfected) # 收集当前模拟的疫情持续天数 pandemic_lengths.append(day) # 转成numpy数组,方便后续导出Excel pandemic_lengths_np = numpy.array(pandemic_lengths) print("The Results of", simulation_times, "simulations is", pandemic_lengths_np)
额外优化建议
- 用
for _ in range(simulation_times)代替while循环,避免手动管理计数变量,逻辑更清晰 - 变量名改用下划线分隔(如
pandemic_lengths),符合Python命名规范,可读性更强 - 可以把单轮模拟的核心逻辑封装成函数,比如
def run_simulation(p, num_children=60):,然后循环调用函数收集结果,代码结构更整洁
内容的提问来源于stack exchange,提问作者lwadz88
相关产品推荐
相关产品推荐

