python包-numpy資料讀取和儲存(二)
目錄
numpy.fromfile和numpy.ndarray.tofile
0.為什麼要使用numpy儲存資料
目前,幾乎所有的機器學習和深度學習演算法的python包都支援numpy,比如sklearn和tensorflow等。使用numpy儲存資料可以十分方便的被各種演算法呼叫。
1.儲存為二進位制檔案(.npy/.npz)並讀取
numpy.save和numpy.load
儲存一個數組到一個二進位制的檔案中,儲存格式是.npy
引數介紹
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
file:檔名/檔案路徑
arr:要儲存的陣列
allow_pickle:布林值,允許使用Python pickles儲存物件陣列(可選引數,預設即可)
fix_imports:為了方便Pyhton2中讀取Python3儲存的資料(可選引數,預設即可)
使用
>>> import numpy as np #生成資料 >>> x=np.arange(10) >>> x array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) #資料儲存 >>> np.save('save_x.npy',x) #讀取儲存的資料 >>> np.load('save_x.npy') array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy.savez
這個同樣是儲存陣列到一個二進位制的檔案中,但是厲害的是,它可以儲存多個數組到同一個檔案中,儲存格式是.npz
,它其實就是多個前面np.save的儲存的npy
,再通過打包(未壓縮)的方式把這些檔案歸到一個檔案上,不行你去解壓npz
檔案就知道了,裡面是就是自己儲存的多個npy
.
引數介紹
numpy.savez(file, *args, **kwds)
file:檔名/檔案路徑
*args:要儲存的陣列,可以寫多個,如果沒有給陣列指定Key,Numpy將預設從'arr_0','arr_1'的方式命名
kwds:(可選引數,預設即可)
使用
>>> import numpy as np
#生成資料
>>> x=np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y=np.sin(x)
>>> y
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
#資料儲存
>>> np.save('save_xy.npz',x,y)
#讀取儲存的資料
>>> npzfile=np.load('save_xy.npz')
>>> npzfile #是一個物件,無法讀取
<numpy.lib.npyio.NpzFile object at 0x7f63ce4c8860>
#按照組數預設的key進行訪問
>>> npzfile['arr_0']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['arr_1']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
更加神奇的是,你可以不適用Numpy預設給陣列的Key,而是自己給陣列有意義的Key,這樣就可以不用去猜測自己載入資料是否是自己需要的.
#資料儲存
>>> np.savez('newsave_xy.npy',x=x,y=y)
#讀取儲存的資料
>>> npzfile=np.load('newsave_xy.npz')
#按照儲存時設定組數key進行訪問
>>> npzfile['x']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['y']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
簡直不能太爽,深度學習中,有時候你儲存了訓練集,驗證集,測試集,還包括他們的標籤,用這個方式儲存起來,要啥載入啥,檔案數量大大減少,也不會到處改檔名去.
numpy.savez_compressed
這個就是在前面numpy.savez的基礎上加了壓縮,前面我介紹時尤其註明numpy.savez是得到的檔案打包,不壓縮的.這個檔案就是對檔案進行打包時使用了壓縮,可以理解為壓縮前各npy
的檔案大小不變,使用該函式比前面的numpy.savez得到的npz
檔案更小.
注:函式所需引數和numpy.savez一致,用法完成一樣.
2.儲存到文字檔案
numpy.savetxt
儲存陣列到文字檔案上,可以直接開啟檢視檔案裡面的內容.
引數介紹
numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)
fname:檔名/檔案路徑,如果檔案字尾是
.gz
,檔案將被自動儲存為.gzip
格式,np.loadtxt可以識別該格式
X:要儲存的1D或2D陣列
fmt:控制資料儲存的格式
delimiter:資料列之間的分隔符
newline:資料行之間的分隔符
header:檔案頭步寫入的字串
footer:檔案底部寫入的字串
comments:檔案頭部或者尾部字串的開頭字元,預設是'#'
encoding:使用預設引數
使用
>>> import numpy as np
#生成資料
>>> x = y = z = np.ones((2,3))
>>> x
array([[1., 1., 1.],
[1., 1., 1.]])
#儲存資料
np.savetxt('test.out', x)
np.savetxt('test1.out', x,fmt='%1.4e')
np.savetxt('test2.out', x, delimiter=',')
np.savetxt('test3.out', x,newline='a')
np.savetxt('test4.out', x,delimiter=',',newline='a')
np.savetxt('test5.out', x,delimiter=',',header='abc')
np.savetxt('test6.out', x,delimiter=',',footer='abc')
儲存下來的檔案都是友好的,可以直接開啟看看有什麼變化.
numpy.loadtxt
根據前面定製的儲存格式,相應的載入資料的函式也得變化,文字檔案中的每一行的資料量必須相同,即無缺失.
引數介紹
numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes')
fname:檔名/檔案路徑,如果檔案字尾是
.gz
或.bz2
,檔案將被解壓,然後再載入
dtype:要讀取的資料型別
comments:檔案頭部或者尾部字串的開頭字元,用於識別頭部,尾部字串
delimiter:劃分讀取上來值的字串
converters:資料行之間的分隔符
skiprows:跳過最前面的幾行,預設為0
usecols:選擇要讀取的列,例usecols=(1,2,5),選取第2、3和6列的資料
unpack:陣列是否轉置,預設是false,不轉置
ndim:指定陣列的維度,即列數,預設為0,即不指定
encoding:編碼方式,預設為‘bytes’
使用
np.loadtxt('test.out')
np.loadtxt('test2.out', delimiter=',')
numpy.genfromtxt
從文字檔案載入資料,並按指定的方式處理缺失值.
引數介紹
numpy.genfromtxt(fname, dtype=<class'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')
fname:檔名/檔案路徑,如果檔案字尾是
.gz
或.bz2
,檔案將被解壓,然後再載入
dtype:要讀取的資料型別
comments:檔案頭部或者尾部字串的開頭字元,用於識別頭部,尾部字串
delimiter:劃分讀取上來值的字串
skiprows:跳過最前面的幾行,預設為0,numpy的1.10中該引數已被移除,請使用skip_header
skip_header:同上
skip_footer:跳過最後面的幾行,預設為0
converters:將列資料轉換為值的一組函式。轉換器還可以用於為丟失的資料提供預設 值:converters = {3: lambda s: float(s or 0)}
missing:numpy的1.10中該引數已被移除,請使用missing_value
missing_value:與缺失資料相對應的字串集
filling_values:用來填充缺失值的集合
secols:選擇要讀取的列,例usecols=(1,2,5),選取第2、3和6列的資料
.......後面不常用的就不寫了
使用
>>> from io import StringIO
>>> import numpy as np
>>> s = StringIO(u"1,1.3,abcde")
>>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
... ('mystring','S5')], delimiter=",")
>>> data
array((1, 1.3, 'abcde'),
dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', '|S5')])
numpy.fromregex
從文字檔案載入資料,並按指定的方式處理缺失值.
引數介紹
numpy.fromregex(file, regexp, dtype, encoding=None)
file:要讀取的檔名
regexp:用於解析檔案的正則表示式。正則表示式中的組對應於dtype中的欄位
dtype:要讀取的資料型別
encoding:編碼方式
使用
>>> f = open('test.dat', 'w')
>>> f.write("1312 foo\n1534 bar\n444 qux")
>>> f.close()
>>> regexp = r"(\d+)\s+(...)" # match [digits, whitespace, anything]
>>> output = np.fromregex('test.dat', regexp,
... [('num', np.int64), ('key', 'S3')])
>>> output
array([(1312L, 'foo'), (1534L, 'bar'), (444L, 'qux')],
dtype=[('num', '<i8'), ('key', '|S3')])
>>> output['num']
array([1312, 1534, 444], dtype=int64)
numpy.fromfile和numpy.ndarray.tofile
引數介紹
numpy.fromfile(file, dtype=float, count=-1,sep='')
file:要讀取的檔名
dtype:要讀取的資料型別,預設‘float’file:要讀取的檔名
count:要讀取的條目數,預設為-1,即全部讀取
sep:條目間的分隔符
引數介紹
numpy.ndarry.tofile(fid, format='%s')
fid:要儲存的檔名
sep:條目間的分隔符
format:格式化輸出
最後,給大家官網網址,可以檢視更多內容https://docs.scipy.org/doc/numpy/reference/routines.io.html