Python科学计算结果的存储与读取
总结于2019年3月17日 荆楚理工学院 计算机工程学院
一、前言
显然,作为一名工科僧,执行科学计算,需用Python。PS:快忘记Matlab吧。我用了二十年的时间,熟练掌握了Matlab的用法,然后,很可能,我用6个月不到的时间,选择并实现了用Python替换Matlab。虽然来到了计算机工程学院,但是工程计算是本业,不能久,然后我突然间发现,好多时候,只用pyplot显示结果,我们的计算结果,很多时候需要存储和重复调用的哪,一个图的话,若再需要数据,下次需要,难道再发费几小时重新计算?
用Python替换Matlab的理由:
(1)并行多核计算简单,效率高
之前用Matlab,并行计算需要时间几小时完成一项工作,该工作相似的计算,在Python里仅 用了2小时不到,5300多秒。可见其差异。另外,并行多核计算的代码非常简单,导入multiprocessing,定义其processes=cpu_count,然后导入Pool,执行apply_async(),调用get()获得return的结果即可,简单,强大!
(2)占地不大
Matlab现在是越来越大了,您懂得……,但并卵,安装Anaconda也不到3GB吧?我添加了许多插件了的。
(3)通用性强
这个,Python作为一门通用语言,已经成功登顶计算机语言排行榜首,不用多说了吧?
二、在Python中存储和读取科学计算结果
1、计算实例
显然,科学计算往往十分复杂,我此处用一个简单的混沌 映射序列作为后来结果的演示:
#导入各种支持
importmatplotlib.pyplot as pltimportnumpy as npimportpandas as pdimportrandomimportmathimportjson#import redis
#建立科学计算#Chebyshev map,初始值0。7,无关a值问题,注意取值是【-1,1】,可通过math.fabs实现切换m
def Chebyshev(maxIter, initial_value=0.7, a=1.0):
y= [0.0] *maxIterfor i inrange(maxIter):if i ==0:
y[i]=initial_valueelse:
y[i]= math.cos(i / math.cos(y[i - 1]))return y
2、采用Json存储和读取
#采用json存储结果
deftest_json_write():
maxIter= 500chaos=Chebyshev(maxIter)
data= { "chaos":chaos, "maxIter":500}
datum= json.dumps(data, ensure_ascii=False)
with open("chaos.json", "w") as f:
json.dump(data, f, indent=4, sort_keys=False)#采用json读取文件
deftest_json_read():
fileName= "chaos"with open("{}.json".format(fileName), "r") as fp:
result=json.load(fp)
chaos= result["chaos"]
maxIter= result["maxIter"]
plt.plot(chaos)
plt.show()
优点:一是可以使用dict字典的形式,使结果存储于JSON中,二是数据可见,通用性强;三是复用方便。
3、使用numpy的形式读取和使用
numpy提供了数组的三种存取方法,如save、load组;tofile和Fromfile组;以及savetxt和loadtxt组,三种方法均可以使用,注意前两种情况是对数组加密的,无法像json或txt一样能够显示计算结果。因此,我们在有条件的情况下,可以txt型,但若有json存储方法存在,Txt其实也没有啥优势,毕竟科学计算结果较大,txt数据文件较大时,不好读入。
#测试数组的存储方式
deftest_numpy_save():
maxIter= 500chaos=Chebyshev(maxIter)
data=np.array(chaos)#data.tofile("chaos.npy",format="%e")
np.savez("chaos.npz", maxIter, chaos)#测试numpy文件的读取
deftest_numpy_load():#chaos=np.fromfile("chaos.npy",dtype=np.double)
result = np.load("chaos.npz")
chaos= result["arr_1"]
plt.plot(chaos)
plt.show()
优点:前两种方法,可以实现数据的简单加密功能。
缺点:(1)如果是其它类型如序列list,需要先转换为数组。(2)save和load,多组存储时,需要按顺序对应读出,显然不方便 。
三、总结
1、存储单个列表
如果只需要存储一个列型数据,如errro序列,则可以直接用numpy的存储方式,先将序列转换为numpy数组,使用数组的三种存储方式均是可以的。
2、多个数组可使用词曲的方式存储
当有多个需要存储的内容时,可将其转换为词典的格式,统一为data={"key1 ’:value1, ’key2’:value2 ,……},然后采用json.dump(data,file)的格式,将数据存储为json格式。
仅用于个人学习和分享,谢绝转载!
版权所有,违者必究。