1. 程式人生 > >python包-numpy資料讀取和儲存(二)

python包-numpy資料讀取和儲存(二)

目錄

0.為什麼要使用numpy儲存資料

1.儲存為二進位制檔案(.npy/.npz)並讀取

numpy.save和numpy.load

numpy.savez

numpy.savez_compressed

2.儲存到文字檔案

numpy.savetxt

numpy.loadtxt

numpy.genfromtxt

numpy.fromregex

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(fileregexpdtypeencoding=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(filedtype=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