網站首頁 編程語言 正文
將 numpy 數組存入文件,有多種文件類型可供選擇,對應地就有不同的方法來讀寫。
下面我將介紹讀寫 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 數組,當 numpy 數組 a 有多維時,需要將其 a.reshape((a.shape[0], -1)) 后才能用這種方式保存。
- 不能追加保存,即每次 np.savetxt() 都會覆蓋之前的內容。
通過 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)
優點:
- npy 文件可以保存任意維度的 numpy 數組,不限于一維和二維;
- npy 保存了 numpy 數組的結構,保存的時候是什么 shape 和 dtype,取出來時就是什么樣的 shape 和 dtype。
缺點:
- 只能保存一個 numpy 數組,每次保存會覆蓋掉之前文件中存在的內容(如果有的話)。
讀寫 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'])
優點:
- npy 文件可以保存任意維度的 numpy 數組,不限于一維和二維;
- npy 保存了 numpy 數組的結構,保存的時候是什么 shape 和 dtype,取出來時就是什么樣的 shape 和 dtype;
- 可以同時保存多個 numpy 數組;
- 可以指定保存 numpy 數組的 key,讀取的時候很方便,不會混亂。
缺點:
- 保存多個 numpy 數組時,只能同時保存,即 np.savez(filename, a, b=b)。每次保存會覆蓋掉之前文件中存在的內容(如果有的話)。
通過 h5py 讀寫 hdf5 文件
優點:
- 不限 numpy 數組維度,可以保持 numpy 數組結構和數據類型;
- 適合 numpy 數組很大的情況,文件占用空間小;
- 可以通過 key 來訪問 dataset(可以理解為 numpy.array),讀取的時候很方便,不會混亂。
- 可以不覆蓋原文件中含有的內容。
簡單讀取
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數組
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')
# 當數組a太大,需要切片進行操作時,可以不直接對h5f['a']進行初始化;
# 當之后不需要改變h5f['a']的shape時,可以省略maxshape參數
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數組
print(h5f['a'][:])
同一個 hdf5 文件可以創建多個 dataset,讀取的時候按照 key 來即可。
總結
- csv 和 txt 只能用來存一維或二維 numpy 數組;
- npy 用來存單個 numpy 數組,npz 可以同時存多個 numpy 數組,兩者都不限 numpy 維度,且都保持 numpy 數組的 shape 和 dtype,寫文件時若原文件存在只能覆蓋原文件內容;
- 當 numpy 數組很大時,最好使用 hdf5 文件,hdf5 文件相對更小;
- 當 numpy 數組很大時,對整個 numpy 數組進行運算容易發生 MemoryError,那么此時可以選擇對 numpy 數組切片,將運算后的數組保存到 hdf5 文件中,hdf5 文件支持切片索引。
References
當Python遇上HDF5--性能優化實戰 -- 張玉騰
雜: PYTHON上數據儲存:推薦h5py -- Pony_s
原文鏈接:https://www.cnblogs.com/wuliytTaotao/p/10914932.html
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-12-01 Redis的數據存儲及String類型的實現_Redis
- 2023-01-15 Python?networkx中獲取圖的鄰接矩陣方式_python
- 2022-04-19 c#中token的使用方法實例_C#教程
- 2022-01-29 yii restfull api 訪問404
- 2022-04-17 C# 利用ExcelDataReader 讀取excel文件
- 2022-05-23 iOS實現全局懸浮按鈕_IOS
- 2022-08-22 C++貪心算法處理多機調度問題詳解_C 語言
- 2023-03-27 Python中元組的概念及應用小結_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支