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
相关产品推荐
相关产品推荐

