numpy數(shù)組之讀寫文件的實(shí)現(xiàn)
將 numpy 數(shù)組存入文件,有多種文件類型可供選擇,對(duì)應(yīng)地就有不同的方法來(lái)讀寫。
下面我將介紹讀寫 numpy 的三類文件:
- txt 或者 csv 文件
- npy 或者 npz 文件
- hdf5 文件
通過(guò) 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)
缺點(diǎn):
- 只能保存一維和二維 numpy 數(shù)組,當(dāng) numpy 數(shù)組 a 有多維時(shí),需要將其 a.reshape((a.shape[0], -1)) 后才能用這種方式保存。
- 不能追加保存,即每次 np.savetxt() 都會(huì)覆蓋之前的內(nèi)容。
通過(guò) 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)點(diǎn):
- npy 文件可以保存任意維度的 numpy 數(shù)組,不限于一維和二維;
- npy 保存了 numpy 數(shù)組的結(jié)構(gòu),保存的時(shí)候是什么 shape 和 dtype,取出來(lái)時(shí)就是什么樣的 shape 和 dtype。
缺點(diǎn):
- 只能保存一個(gè) numpy 數(shù)組,每次保存會(huì)覆蓋掉之前文件中存在的內(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,那么默認(rèn)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)點(diǎn):
- npy 文件可以保存任意維度的 numpy 數(shù)組,不限于一維和二維;
- npy 保存了 numpy 數(shù)組的結(jié)構(gòu),保存的時(shí)候是什么 shape 和 dtype,取出來(lái)時(shí)就是什么樣的 shape 和 dtype;
- 可以同時(shí)保存多個(gè) numpy 數(shù)組;
- 可以指定保存 numpy 數(shù)組的 key,讀取的時(shí)候很方便,不會(huì)混亂。
缺點(diǎn):
- 保存多個(gè) numpy 數(shù)組時(shí),只能同時(shí)保存,即 np.savez(filename, a, b=b)。每次保存會(huì)覆蓋掉之前文件中存在的內(nèi)容(如果有的話)。
通過(guò) h5py 讀寫 hdf5 文件
優(yōu)點(diǎn):
- 不限 numpy 數(shù)組維度,可以保持 numpy 數(shù)組結(jié)構(gòu)和數(shù)據(jù)類型;
- 適合 numpy 數(shù)組很大的情況,文件占用空間??;
- 可以通過(guò) key 來(lái)訪問(wèn) dataset(可以理解為 numpy.array),讀取的時(shí)候很方便,不會(huì)混亂。
- 可以不覆蓋原文件中含有的內(nèi)容。
簡(jiǎn)單讀取
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))
# 通過(guò)切片得到numpy數(shù)組
print(h5f['a'][:])
print(h5f['b'][:])
h5f.close()
通過(guò)切片賦值
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')
# 當(dāng)數(shù)組a太大,需要切片進(jìn)行操作時(shí),可以不直接對(duì)h5f['a']進(jìn)行初始化;
# 當(dāng)之后不需要改變h5f['a']的shape時(shí),可以省略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'])
# 通過(guò)切片得到numpy數(shù)組
print(h5f['a'][:])同一個(gè) hdf5 文件可以創(chuàng)建多個(gè) dataset,讀取的時(shí)候按照 key 來(lái)即可。
總結(jié)
- csv 和 txt 只能用來(lái)存一維或二維 numpy 數(shù)組;
- npy 用來(lái)存單個(gè) numpy 數(shù)組,npz 可以同時(shí)存多個(gè) numpy 數(shù)組,兩者都不限 numpy 維度,且都保持 numpy 數(shù)組的 shape 和 dtype,寫文件時(shí)若原文件存在只能覆蓋原文件內(nèi)容;
- 當(dāng) numpy 數(shù)組很大時(shí),最好使用 hdf5 文件,hdf5 文件相對(duì)更小;
- 當(dāng) numpy 數(shù)組很大時(shí),對(duì)整個(gè) numpy 數(shù)組進(jìn)行運(yùn)算容易發(fā)生 MemoryError,那么此時(shí)可以選擇對(duì) numpy 數(shù)組切片,將運(yùn)算后的數(shù)組保存到 hdf5 文件中,hdf5 文件支持切片索引。
References
當(dāng)Python遇上HDF5--性能優(yōu)化實(shí)戰(zhàn) -- 張玉騰
雜: PYTHON上數(shù)據(jù)儲(chǔ)存:推薦h5py -- Pony_s
到此這篇關(guān)于numpy數(shù)組之讀寫文件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)numpy數(shù)組讀寫文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序
大麥網(wǎng),是中國(guó)綜合類現(xiàn)場(chǎng)娛樂(lè)票務(wù)營(yíng)銷平臺(tái),業(yè)務(wù)覆蓋演唱會(huì)、 話劇、音樂(lè)劇、體育賽事等領(lǐng)域,但是因?yàn)槠睌?shù)有限,還有黃牛們不能丟了飯碗,所以導(dǎo)致了,很多人都搶不到票,那么,今天帶大家用Python來(lái)制作一個(gè)自動(dòng)搶票的腳本小程序,需要的朋友可以參考下2023-07-07
使用Python實(shí)現(xiàn)發(fā)送郵件的常用方法小結(jié)
在日常工作中,我們可能經(jīng)常會(huì)用到發(fā)送郵件,但如果每次都人工來(lái)發(fā)送,那豈不是很麻煩,今天我們就來(lái)講解下如何通過(guò)python語(yǔ)言來(lái)優(yōu)雅地發(fā)送郵件2024-04-04
使用Python腳本生成隨機(jī)IP的簡(jiǎn)單方法
這篇文章主要介紹了使用Python腳本生成隨機(jī)IP的簡(jiǎn)單方法,并且可以自己設(shè)定IP數(shù)值范圍,需要的朋友可以參考下2015-07-07
解決tensorboard多個(gè)events文件顯示紊亂的問(wèn)題
今天小編就為大家分享一篇解決tensorboard多個(gè)events文件顯示紊亂的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
Python采集圖片數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了Python采集圖片數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
基于Python繪制一個(gè)會(huì)動(dòng)的3D立體粽子
下周就要到端午節(jié)了,所以本文小編就來(lái)和大家分享一個(gè)有趣的Python項(xiàng)目——繪制會(huì)動(dòng)的3D立體粽子,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06

