天天看點

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格式。

原文位址

https://www.cnblogs.com/lvqing323/p/10545711.html