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格式。
原文位址
https://www.cnblogs.com/lvqing323/p/10545711.html