numpy數(shù)組之存取文件的實現(xiàn)示例
將 numpy 數(shù)組存入文件,有多種文件類型可供選擇,對應地就有不同的方法來讀寫。
下面我將介紹讀寫 numpy 的三類文件:
- txt 或者 csv 文件
- npy 或者 npz 文件
- hdf5 文件
通過 numpy 讀寫 txt 或 csv 文件
import numpy as np a = np.array(range(20)).reshape((4, 5)) print(a) # 后綴改為 .txt 一樣 filename = 'data/a.csv' # 寫文件 np.savetxt(filename, a, fmt='%d', delimiter=',') # 讀文件 b = np.loadtxt(filename, dtype=np.int32, delimiter=',') print(b)
缺點:
- 只能保存一維和二維 numpy 數(shù)組,當 numpy 數(shù)組 a 有多維時,需要將其 a.reshape((a.shape[0], -1)) 后才能用這種方式保存。
- 不能追加保存,即每次 np.savetxt() 都會覆蓋之前的內(nèi)容。
通過 numpy 讀寫 npy 或 npz 文件
讀寫 npy 文件
import numpy as np a = np.array(range(20)).reshape((2, 2, 5)) print(a) filename = 'data/a.npy' # 寫文件 np.save(filename, a) # 讀文件 b = np.load(filename) print(b) print(b.shape)
優(yōu)點:
- npy 文件可以保存任意維度的 numpy 數(shù)組,不限于一維和二維;
- npy 保存了 numpy 數(shù)組的結(jié)構(gòu),保存的時候是什么 shape 和 dtype,取出來時就是什么樣的 shape 和 dtype。
缺點:
- 只能保存一個 numpy 數(shù)組,每次保存會覆蓋掉之前文件中存在的內(nèi)容(如果有的話)。
讀寫 npz 文件
import numpy as np a = np.array(range(20)).reshape((2, 2, 5)) b = np.array(range(20, 44)).reshape(2, 3 ,4) print('a:\n', a) print('b:\n', b) filename = 'data/a.npz' # 寫文件, 如果不指定key,那么默認key為'arr_0'、'arr_1',一直排下去。 np.savez(filename, a, b=b) # 讀文件 c = np.load(filename) print('keys of NpzFile c:\n', c.keys()) print("c['arr_0']:\n", c['arr_0']) print("c['b']:\n", c['b'])
優(yōu)點:
- npy 文件可以保存任意維度的 numpy 數(shù)組,不限于一維和二維;
- npy 保存了 numpy 數(shù)組的結(jié)構(gòu),保存的時候是什么 shape 和 dtype,取出來時就是什么樣的 shape 和 dtype;
- 可以同時保存多個 numpy 數(shù)組;
- 可以指定保存 numpy 數(shù)組的 key,讀取的時候很方便,不會混亂。
缺點:
- 保存多個 numpy 數(shù)組時,只能同時保存,即 np.savez(filename, a, b=b) 。每次保存會覆蓋掉之前文件中存在的內(nèi)容(如果有的話)。
通過 h5py 讀寫 hdf5 文件
優(yōu)點:
- 不限 numpy 數(shù)組維度,可以保持 numpy 數(shù)組結(jié)構(gòu)和數(shù)據(jù)類型;
- 適合 numpy 數(shù)組很大的情況,文件占用空間?。?/li>
- 可以通過 key 來訪問 dataset(可以理解為 numpy.array),讀取的時候很方便,不會混亂。
- 可以不覆蓋原文件中含有的內(nèi)容。
簡單讀取
import numpy as np import h5py a = np.array(range(20)).reshape((2, 2, 5)) b = np.array(range(20)).reshape((1, 4, 5)) print(a) print(b) filename = 'data/data.h5' # 寫文件 h5f = h5py.File(filename, 'w') h5f.create_dataset('a', data=a) h5f.create_dataset('b', data=b) h5f.close() # 讀文件 h5f = h5py.File(filename, 'r') print(type(h5f)) # 通過切片得到numpy數(shù)組 print(h5f['a'][:]) print(h5f['b'][:]) h5f.close()
通過切片賦值
import numpy as np import h5py a = np.array(range(20)).reshape((2, 2, 5)) print(a) filename = 'data/a.h5' # 寫文件 h5f = h5py.File(filename, 'w') # 當數(shù)組a太大,需要切片進行操作時,可以不直接對h5f['a']進行初始化; # 當之后不需要改變h5f['a']的shape時,可以省略maxshape參數(shù) h5f.create_dataset('a', shape=(2, 2, 5), maxshape=(None, 2, 5), dtype=np.int32, compression='gzip') for i in range(2): # 采用切片的形式賦值 h5f['a'][i] = a[i] h5f.close() # 讀文件 h5f = h5py.File(filename, 'r') print(type(h5f)) print(h5f['a']) # 通過切片得到numpy數(shù)組 print(h5f['a'][:])
同一個 hdf5 文件可以創(chuàng)建多個 dataset,讀取的時候按照 key 來即可。
總結(jié)
- csv 和 txt 只能用來存一維或二維 numpy 數(shù)組;
- npy 用來存單個 numpy 數(shù)組,npz 可以同時存多個 numpy 數(shù)組,兩者都不限 numpy 維度,且都保持 numpy 數(shù)組的 shape 和 dtype,寫文件時若原文件存在只能覆蓋原文件內(nèi)容;
- 當 numpy 數(shù)組很大時,最好使用 hdf5 文件,hdf5 文件相對更小;
- 當 numpy 數(shù)組很大時,對整個 numpy 數(shù)組進行運算容易發(fā)生 MemoryError,那么此時可以選擇對 numpy 數(shù)組切片,將運算后的數(shù)組保存到 hdf5 文件中,hdf5 文件支持切片索引。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
使用Python中的Playwright制作測試視頻的實現(xiàn)步驟
Playwright 是一種流行的用于測試 Web 應用程序的自動化工具,它提供了多種功能來使測試更加高效和可靠,這些功能之一是能夠捕獲測試運行的視頻,在此博客中,田辛老師將探索如何使用 Python 中的 Playwright 制作測試視頻,感興趣的同學可以參考本文自己動手嘗試2023-10-10Python函數(shù)式編程指南(二):從函數(shù)開始
這篇文章主要介紹了Python函數(shù)式編程指南(二):從函數(shù)開始,本文講解了定義一個函數(shù)、使用函數(shù)賦值、閉包、作為參數(shù)等內(nèi)容,需要的朋友可以參考下2015-06-06Python?PaddleNLP開源實現(xiàn)快遞單信息抽取
這篇文章主要為大家介紹了Python?PaddleNLP開源項目實現(xiàn)對快遞單信息抽取,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06