Python科学计算结果的存储与读取
Python科学计算结果的存储与读取
Python科学计算结果的存储与读取
总结于2019年3月17日 荆楚理工学院计算机工程学院
一、前言
显然,作为一名工科僧,执行科学计算,着用Python,快忘记Matlab吧。我用了二十年的时间,熟练掌握了Matlab的用法,然后,很可能,我用6个月不到的时间,选择并实现了用Python替换Matlab。虽然来到了计算机工程学院,但是科学计算是本业,不能久,然后我突然间发现,好多时候,只用pyplot显示结果,我们的计算结果,很多时候需要存储和重复调用的哪,一个图的话,若再需要数据,下次需要,难道再发费几小时重新计算?
用Python替换Matlab的理由:
(1)并行多核计算简单,效率高
之前用Matlab,并行计算需要时间几小时完成一项工作,该工作相似的计算,在Python里仅 用了2小时不到,5300多秒。可见其差异。另外,并行多核计算的代码非常简单,导入multiprocessing,定义其cpu_count,然后导入Pool,执行apply_async,调用get()获得return的结果即可,简单,强大!
(2)占地不大
Matlab现在是越来越大了,您懂得……,但并卵,安装Anaconda也不到3GB吧?我添加了许多插件了的。
(3)通用性强
这个,Python作为一门通用语言,已经成功登顶计算机语言排行榜首,不用多说了吧?
二、在Python中存储和读取科学计算结果
1、计算实例
显然,科学计算往往十分复杂,我此处用一个简单的混沌 映射序列作为后来结果的演示:
1 # 导入各种支持 2 import matplotlib.pyplot as plt 3 import numpy as np 4 import pandas as pd 5 import random 6 import math 7 import json 8 # import redis 9 10 11 # 建立科学计算 12 # Chebyshev map,初始值0。7,无关a值问题,注意取值是【-1,1】,可通过math.fabs实现切换m 13 def Chebyshev(maxIter, initial_value=0.7, a=1.0): 14 y = [0.0] * maxIter 15 for i in range(maxIter): 16 if i == 0: 17 y[i] = initial_value 18 else: 19 y[i] = math.cos(i / math.cos(y[i - 1])) 20 return y
2、采用Json存储和读取
# 采用json存储结果 def test_json_write(): maxIter = 500 chaos = 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读取文件 def test_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数据文件较大时,不好读入。
# 测试数组的存储方式 def test_numpy_save(): maxIter = 500 chaos = Chebyshev(maxIter) data = np.array(chaos) # data.tofile('chaos.npy',format='%e') np.savez('chaos.npz', maxIter, chaos) # 测试numpy文件的读取 def test_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、存储单个列表
如果只需要存储一个列型数据,如errro序列,则可以直接用numpy的存储方式,先将序列转换为numpy数组,使用数组的三种存储方式均是可以的。
2、多个数组可使用词曲的方式存储
当有多个需要存储的内容时,可将其转换为词典的格式,统一为data={‘key1 ’:value1, ’key2’:value2 ,……},然后采用json.dump(data,file)的格式,将数据存储为json格式。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
无限极分类
$arr = array( 0=>[ 'id'=>1, 'name'=>'科技', 'pid'=>0, ], 1=>[ 'id'=>2, 'name'=>'人工智能', 'pid'=>1, ], 2=>[ 'id'=>3, 'name'=>'美食', 'pid'=>0 ], 3=>[ 'id'=>4, 'name'=>'重庆小面', 'pid'=>3 ], 4=>[ 'id'=>5, 'name'=>'机器人', 'pid'=>2 ] ); public function category($arr,$pid=0,$level=0){ //定义一个静态变量,存储一个空数组,用静态变量,是因为静态变量不会被销毁,会保存之前保留的值,普通变量在函数结束时,会死亡,生长周期函数开始到函数结束,再次调用重新开始生长 //保存一个空数组 static $list=array(); //通过遍历查找是否属于顶级父类,pid=0为顶级父类, foreach($arr as $val...
- 下一篇
Python进阶:如何将字符串常量转化为变量?
前几天,我们Python猫交流学习群 里的 M 同学提了个问题。这个问题挺有意思,经初次讨论,我们认为它无解。 然而,我认为它很有价值,应该继续思考怎么解决,所以就在私密的知识星球上记录了下来。 万万没想到的是,在第二天,有两位同学接连给出了解决方法! 由此,群内出现了一轮热烈的技术交流。 本文将相关的内容要点作了梳理,并由此引申到更进一步的学习话题,希望对你有所帮助。 1、如何动态生成变量名? M 同学的问题如下: 打扰一下大家,请教一个问题,已知 list = ['A', 'B', 'C', 'D'] , 如何才能得到以 list 中元素命名的新列表 A = [], B = [], C = [], D = [] 呢? 简单理解,这个问题的意思是,将字符串内容作为其它对象的变量名。 list 中的元素是字符串,此处的 ‘A’-‘D’ 是常量 ,而在要求的结果中,A-D 是变量 。 如果强行直接将常量当做变量使用,它会报错: >>> 'A' = [] ...SyntaxError: can't assign to literal 报错中的literal 指的是字面量 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果