You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numpy中无法存储多次模拟结果,仅保留最后一次数据的问题

问题分析与解决方法

核心问题定位

你的代码里,每次模拟循环内执行pandemiclength2 = numpy.append(pandemiclength1, day),但pandemiclength1在循环过程中始终是初始的空列表,而且pandemiclength1 = pandemiclength2是放在最外层循环外面的,这就导致每次循环都只是把当前的day追加到空列表里,最后只剩最后一次模拟的结果。

修复方案

方法一:用列表收集结果(高效且适合新手)

numpy数组每次追加会重新分配内存,小数据量没问题,但先通过普通列表收集所有结果,最后转成numpy数组更高效:

  1. 初始化空列表pandemic_lengths = []
  2. 每次模拟结束后,把当前的day追加到列表:pandemic_lengths.append(day)
  3. 所有模拟完成后,转成numpy数组:pandemic_lengths_np = numpy.array(pandemic_lengths)

方法二:修复numpy数组追加逻辑

如果坚持用numpy数组,要确保每次追加是基于上一次的结果:

  1. 初始化pandemiclength = numpy.array([])
  2. 每次模拟结束后执行: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:53:15