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

Python嵌套循环统计值保存异常:仅写入最后一行数据

解决Python循环中保存统计结果仅保留最后一行的问题

你遇到的问题非常典型——每次循环调用np.savetxt()时,默认会覆盖目标文件的内容,所以最后只有最后一次循环的结果被保留;而屏幕能打印所有结果是因为print是实时输出,不会覆盖之前的内容。

问题根源

你的代码里,每次循环都执行:

np.savetxt('result.dat',stat,fmt='%9.2f')

np.savetxt()默认的写入模式是'w'(覆盖写入),意味着每一次循环都会清空之前的文件内容,然后写入当前循环的stat数据,最终文件里自然只剩最后一组结果。

两种解决方案

方案一:先收集所有结果,循环结束后一次性写入(推荐)

这种方法更高效,尤其适合数据量不大的场景,也方便后续对所有统计结果做统一处理。

修改后的完整代码:

import numpy as np
from scipy.stats.stats import pearsonr

# 不要用list做变量名,会覆盖Python内置的list类型
date_list = ['01', '02','03','04','05','06','07','08','09','10']
month='NOV2016'
all_stats = []  # 用来存储所有循环的统计结果

for date in date_list:
    path='D:/Match-Nov2016/24-match-ground-imsra-0.25/'
    data=np.loadtxt(path+'3DIMG_'+date+month+'_DAILY.dat')
    ground=data[:,2]
    model=data[:,5]
    
    # 计算统计值
    bias=np.round(np.mean(model-ground), 2)
    rms=np.round(np.sqrt(np.mean((ground-model)**2)), 2)
    std=np.round(np.std(ground-model), 2)
    corr=np.round(pearsonr(ground,model)[0], 2)
    
    # 将当前结果添加到列表
    all_stats.append([bias, rms, std, corr])
    print([bias, rms, std, corr])

# 转换为numpy数组后一次性写入文件
stat_array = np.array(all_stats)
np.savetxt('result.dat', stat_array, fmt='%9.2f')

方案二:以追加模式逐次写入

如果数据量极大,不想占用过多内存,可以每次循环以追加模式写入文件,指定mode='a'参数即可:

import numpy as np
from scipy.stats.stats import pearsonr

date_list = ['01', '02','03','04','05','06','07','08','09','10']
month='NOV2016'

# 先清空文件(避免多次运行时内容叠加,可选)
with open('result.dat', 'w') as f:
    pass

for date in date_list:
    path='D:/Match-Nov2016/24-match-ground-imsra-0.25/'
    data=np.loadtxt(path+'3DIMG_'+date+month+'_DAILY.dat')
    ground=data[:,2]
    model=data[:,5]
    
    bias=np.round(np.mean(model-ground), 2)
    rms=np.round(np.sqrt(np.mean((ground-model)**2)), 2)
    std=np.round(np.std(ground-model), 2)
    corr=np.round(pearsonr(ground,model)[0], 2)
    
    stat = np.array([[bias, rms, std, corr]])
    print(stat)
    # 以追加模式写入
    np.savetxt('result.dat', stat, fmt='%9.2f', mode='a')

额外小提示

尽量避免用list作为变量名,它是Python的内置类型,会覆盖掉内置的list()函数,可能导致后续代码出现难以排查的错误。

内容的提问来源于stack exchange,提问作者Azam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:39:01