python知识:numpy如何保存矩阵
一、說明
????????本文主要說明,numpy的張量如何存儲導出,或導入。即:如何將array保存到txt文件中?如何將存到txt文件中的數據讀出為ndarray類型?python如何保存矩陣,保存matrix,保存numpy.ndarray
二、案例1 :存儲np.array數據
1) 缺省按照格式
a?=?np.arange(0,12,0.5).reshape(4,-1)??
np.savetxt("a.txt",?a)?#?缺省按照'%.18e'格式保存數據,以空格分隔??
np.loadtxt("a.txt")??
array([[??0.?,???0.5,???1.?,???1.5,???2.?,???2.5],??
???????[??3.?,???3.5,???4.?,???4.5,???5.?,???5.5],??
???????[??6.?,???6.5,???7.?,???7.5,???8.?,???8.5],??
???????[??9.?,???9.5,??10.?,??10.5,??11.?,??11.5]])
有些時候會報錯:TypeError: Mismatch between array dtype (‘object’) and format specifier (‘%.18e’) ?其中format specifier (‘%.18e’)表示傳入的格式,常用的有%d,%s,或%f
?fmt?:?str?or?sequence?of?strs,?optionalA?single?format?(%10.5f),?a?sequence?of?formats,?or?amulti-format?string,?e.g.?'Iteration?%d?--?%10.5f',?in?which????????case?`delimiter`?is?ignored.?For?complex?`X`,?the?legal?options????????for?`fmt`?are:????????????a)?a?single?specifier,?`fmt='%.4e'`,?resulting?in?numbers?formattedlike?`'?(%s+%sj)'?%?(fmt,?fmt)`b)?a?full?string?specifying?every?real?and?imaginary?part,?e.g.`'?%.4e?%+.4ej?%.4e?%+.4ej?%.4e?%+.4ej'`?for?3?columnsc)?a?list?of?specifiers,?one?per?column?-?in?this?case,?the?real????????????????and?imaginary?part?must?have?separate?specifiers,e.g.?`['%.3e?+?%.3ej',?'(%.15e%+.15ej)']`?for?2?columns2) 指定格式
np.savetxt("a.txt",?a,?fmt="%d",?delimiter=",")?#改為保存為整數,以逗號分隔?? np.loadtxt("a.txt",delimiter=",")?#?讀入的時候也需要指定逗號分隔?? array([[??0.,???0.,???1.,???1.,???2.,???2.],??[??3.,???3.,???4.,???4.,???5.,???5.],??[??6.,???6.,???7.,???7.,???8.,???8.],??[??9.,???9.,??10.,??10.,??11.,??11.]])案例,以下存儲三個list類型的數據:
import numpy data = numpy.array([[2,6,1],[1,7,2,0,1],[7,2,3,4]],dtype=object) numpy.savetxt("filename.txt",data ,fmt="%s",delimiter=",")
但是在加載過程中會報錯!應該注意這種維度的不同
將提示無法讀入。如果處理下:加個b
c=numpy.loadtxt(b"filename.txt",delimiter=",",skiprows=0,dtype=int)1返回的結果反而變了,當成了一個數組,因此,在用loadtxt適用于1維?
結論:能夠讀寫磁盤上的文本數據或二進制數據。?
三、存取文本文件
np.loadtxt和np.savetxt可以讀寫1維和2維的數組:
np.loadtxt(FILENAME, dtype=int, delimiter=’ ‘)?
np.savetxt(“a.txt”, a, fmt=”%d”, delimiter=”,”)
1)例子:
a=np.arange(0,10).reshape(2,-1) array([[0,?1,?2,?3,?4],[5,?6,?7,?8,?9]]) np.savetxt("a.txt",a)?#缺省按照'%.18e'格式保存數據,以空格分隔 np.loadtxt("a.txt") array([[?0.,??1.,??2.,??3.,??4.],[?5.,??6.,??7.,??8.,??9.]])a=np.arange(0,10,0.5).reshape(4,-1)array([[?0.?,??0.5,??1.?,??1.5,??2.?],[?2.5,??3.?,??3.5,??4.?,??4.5],[?5.?,??5.5,??6.?,??6.5,??7.?],[?7.5,??8.?,??8.5,??9.?,??9.5]]) np.savetxt("a.txt",a,fmt="%d",delimiter=",")#改為保存為整數,以逗號分隔 np.loadtxt("a.txt",delimiter=",")#load時也要指定為逗號分隔 array([[?0.,??0.,??1.,??1.,??2.],[?2.,??3.,??3.,??4.,??4.],[?5.,??5.,??6.,??6.,??7.],[?7.,??8.,??8.,??9.,??9.]])2)np.savez 多個數組保存
????????如果你想將多個數組保存到一個文件中的話,使用numpy.savez函數。savez函數的第一個參數是文件名,其后的參數都是需要保存的數組,也可以使用關鍵字參數為數組起一個名字,非關鍵字參數傳遞的數組會自動起名為arr_0, arr_1, …。savez函數輸出的是一個壓縮文件(擴展名為npz),其中每個文件都是一個save函數保存的npy文件,文件名對應于數組名。load函數自動識別npz文件,并且返回一個類似于字典的對象,可以通過數組名作為關鍵字獲取數組的內容:
>>>?C=np.array([1,0,1,0]) >>>?np.savez("files.npz",A,B,C_array=C) >>>?D=np.load("files.npz") >>>?D['arr_0'] array([[?0,??1,??2,??3,??4],[?5,??6,??7,??8,??9],[10,?11,?12,?13,?14]]) >>>?D['arr_1'] array([[?0,??1,??2,??3,??4],[?5,??6,??7,??8,??9],[10,?11,?12,?13,?14]]) >>>?D['arr_2'] Traceback?(most?recent?call?last):File?"<input>",?line?1,?in?<module>File?"D:\Python3\lib\site-packages\numpy\lib\npyio.py",?line?255,?in?__getitem__raise?KeyError("%s?is?not?a?file?in?the?archive"?%?key) KeyError:?'arr_2?is?not?a?file?in?the?archive'>>>?D['C_array'] array([1,?0,?1,?0])如果你用解壓軟件打開files.npz文件的話,會發現其中有三個文件:arr_0.npy, arr_1.npy, C_array.npy,其中分別保存著數組A,B,C的內容
3)np.load和np.save將數組以二進制格式保存到磁盤
np.load和np.save是讀寫磁盤數組數據的兩個主要函數,默認情況下,數組是以未壓縮的原始二進制格式保存在擴展名為.npy的文件中。
>>>?import?numpy?as?np A?=?np.arange(15).reshape(3,5) >>>?A array([[?0,??1,??2,??3,??4],[?5,??6,??7,??8,??9],[10,?11,?12,?13,?14]]) >>>?np.save("A.npy",A)???#如果文件路徑末尾沒有擴展名.npy,該擴展名會被自動加上。 >>>?B=np.load("A.npy") >>>?B array([[?0,??1,??2,??3,??4],[?5,??6,??7,??8,??9],[10,?11,?12,?13,?14]])注:保存為Numpy專用的二進制格式后,就不能用notepad++等打開看了(亂碼)。因此這種方式建議在不需要看保存文件內容的情況下使用。
三、關于numpy的其它方法
1) a.tofile的方法。
a = np.array( [ [1,2,3],[6,7,9] ])
a.tofile("filename.bin")
? ? ? 這種方法只能保存為二進制文件,且不能保存當前數據的行列信息,文件后綴不一定非要是bin,也可以為txt,但不影響保存格式,都是二進制。
? ? ? 這種保存方法對數據讀取有要求,需要手動指定讀出來的數據的的dtype,如果指定的格式與保存時的不一致,則讀出來的就是錯誤的數據。
? ? ? ?b = numpy.fromfile("filename.bin",dtype = **)
? ? ? ?讀出來的數據是一維數組,需要利用
? ? ? ? b.shape = 3,2重新指定維數。
2) numpy.save的方法。
.numpy.save("filename.npy",a)
利用這種方法,保存文件的后綴名字一定會被置為.npy,這種格式最好只用
numpy.load("filename")來讀取。
?
?
總結
以上是生活随笔為你收集整理的python知识:numpy如何保存矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python知识:opencv实现的直方
- 下一篇: python知识:函数abs、delat