numpy中文件的存儲和讀取


轉載:https://www.cnblogs.com/sunshinewang/p/8892330.html

一維和二維數組

存儲 np.savetxt

np.savetxt(frame,array,fmt='%.18e',delimiter=None,newline='\n', header='', footer='', comments='# ', encoding=None)
frame : 文件、字符串或產生器,可以是.gz或.bz2的壓縮文件 。
array : 存入文件的數組 (一維或者二維)。
fmt:寫入文件的格式,例如: %d %.2f %.18e 。
delimiter : 分割字符串,默認是任何空格 。
import numpy as np

a = np.arange(100).reshape((5,20))

np.savetxt('a.csv',a,fmt = '%d',delimiter=',')

b = np.loadtxt('a.csv',delimiter=',')

b

array([[ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
        13., 14., 15., 16., 17., 18., 19.],
       [20., 21., 22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32.,
        33., 34., 35., 36., 37., 38., 39.],
       [40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51., 52.,
        53., 54., 55., 56., 57., 58., 59.],
       [60., 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72.,
        73., 74., 75., 76., 77., 78., 79.],
       [80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90., 91., 92.,
        93., 94., 95., 96., 97., 98., 99.]])

讀取 np.loadtxt

np.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes')
frame : 文件、字符串或產生器,可以是.gz或.bz2的壓縮文件。
dtype : 數據類型,可選 。
delimiter : 分割字符串,默認是任何空格 。
usecols:選取數據的列。
unpack : 如果True,讀入屬性將分別寫入不同變量 。

注意:usecols,如果選取前三列,應該是usecols=(0,1,2),如果只選取第三列,應該是usecols=(2,)。但是,我嘗試了一下,不輸入逗號也可以,usecols=(2)。

b = np.loadtxt('a.csv',dtype = np.int,delimiter=',',usecols=(0,1,2))

b
array([[ 0,  1,  2],
       [20, 21, 22],
       [40, 41, 42],
       [60, 61, 62],
       [80, 81, 82]])

b = np.loadtxt('a.csv',dtype = np.int,delimiter=',',usecols=(2,))

b
array([ 2, 22, 42, 62, 82])

b = np.loadtxt('a.csv',dtype = np.int,delimiter=',',usecols=(2))

b
array([ 2, 22, 42, 62, 82])

需要注意的是CSV文件只能有效存儲一維和二維數組 。

np.savetxt() np.loadtxt()只能有效存取一維和二維數組。

多維數組(任意維度)

存儲 .tofile

a.tofile(frame, sep='', format='%s')
frame : 文件、字符串
sep : 數據分割字符串,如果是空串,寫入文件爲二進制。即,默認爲空串。
format : 寫入數據的格式
import numpy as np

a = np.arange(100).reshape((5,10,2))

a
Out[3]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29],
        [30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49],
        [50, 51],
        [52, 53],
        [54, 55],
        [56, 57],
        [58, 59]],

       [[60, 61],
        [62, 63],
        [64, 65],
        [66, 67],
        [68, 69],
        [70, 71],
        [72, 73],
        [74, 75],
        [76, 77],
        [78, 79]],

       [[80, 81],
        [82, 83],
        [84, 85],
        [86, 87],
        [88, 89],
        [90, 91],
        [92, 93],
        [94, 95],
        [96, 97],
        [98, 99]]])
a.tofile('b.dat',sep=',',format='%d')

讀取 .fromfile

np.fromfile(frame, dtype=float, count=1, sep='')
frame : 文件、字符串
dtype : 讀取的數據類型 。可以發現,我們讀取數據的時候都需要指定數據類型,無論是不是一維二維。默認爲浮點型
count : 讀入元素個數, ‐1表示讀入整個文件
sep : 數據分割字符串,如果是空串,寫入文件爲二進制
c = np.fromfile('b.dat',dtype=np.int,sep=',')
c
Out[6]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
       85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])

可以發現,讀取到的數據維度信息丟失了。因此,我們需要將維度信息告訴c。

c = np.fromfile('b.dat',dtype=np.int,sep=',').reshape((5,10,2))
c
Out[14]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29],
        [30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49],
        [50, 51],
        [52, 53],
        [54, 55],
        [56, 57],
        [58, 59]],

       [[60, 61],
        [62, 63],
        [64, 65],
        [66, 67],
        [68, 69],
        [70, 71],
        [72, 73],
        [74, 75],
        [76, 77],
        [78, 79]],

       [[80, 81],
        [82, 83],
        [84, 85],
        [86, 87],
        [88, 89],
        [90, 91],
        [92, 93],
        [94, 95],
        [96, 97],
        [98, 99]]])

如果我們不指定分隔符,則讀取也不需要指定,此時存儲的是二進制文件。

a = np.arange(100).reshape((5,10,2))

a
Out[18]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29],
        [30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49],
        [50, 51],
        [52, 53],
        [54, 55],
        [56, 57],
        [58, 59]],

       [[60, 61],
        [62, 63],
        [64, 65],
        [66, 67],
        [68, 69],
        [70, 71],
        [72, 73],
        [74, 75],
        [76, 77],
        [78, 79]],

       [[80, 81],
        [82, 83],
        [84, 85],
        [86, 87],
        [88, 89],
        [90, 91],
        [92, 93],
        [94, 95],
        [96, 97],
        [98, 99]]])

a.tofile('b.dat',format='%d')

c = np.fromfile('b.dat',dtype=np.int).reshape((5,10,2))

c
Out[21]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29],
        [30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49],
        [50, 51],
        [52, 53],
        [54, 55],
        [56, 57],
        [58, 59]],

       [[60, 61],
        [62, 63],
        [64, 65],
        [66, 67],
        [68, 69],
        [70, 71],
        [72, 73],
        [74, 75],
        [76, 77],
        [78, 79]],

       [[80, 81],
        [82, 83],
        [84, 85],
        [86, 87],
        [88, 89],
        [90, 91],
        [92, 93],
        [94, 95],
        [96, 97],
        [98, 99]]])

需要注意

該方法需要讀取時知道存入文件時數組的維度和元素類型
a.tofile()和np.fromfile()需要配合使用
可以通過元數據文件來存儲額外信息

Numpy文件的便捷存取

np.save(fname, array) 或 np.savez(fname, array)

fname : 文件名,以.npy爲擴展名,壓縮擴展名爲.npz
array : 數組變量

np.load(fname)

fname : 文件名,以.npy爲擴展名,壓縮擴展名爲.npz
a = np.arange(100).reshape(5, 10, 2)

np.save('a.npy',a)

b = np.load('a.npy)
            b = np.load('a.npy')

b
Out[26]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7],
        [ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15],
        [16, 17],
        [18, 19]],

       [[20, 21],
        [22, 23],
        [24, 25],
        [26, 27],
        [28, 29],
        [30, 31],
        [32, 33],
        [34, 35],
        [36, 37],
        [38, 39]],

       [[40, 41],
        [42, 43],
        [44, 45],
        [46, 47],
        [48, 49],
        [50, 51],
        [52, 53],
        [54, 55],
        [56, 57],
        [58, 59]],

       [[60, 61],
        [62, 63],
        [64, 65],
        [66, 67],
        [68, 69],
        [70, 71],
        [72, 73],
        [74, 75],
        [76, 77],
        [78, 79]],

       [[80, 81],
        [82, 83],
        [84, 85],
        [86, 87],
        [88, 89],
        [90, 91],
        [92, 93],
        [94, 95],
        [96, 97],
        [98, 99]]])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章