numpy
中csv文件的存儲(chǔ)和讀取
CSV文件:(Comma‐Separated Value, 逗號(hào)分隔值)
一維和二維數(shù)組
存儲(chǔ)
np.savetxt(frame,array,fmt='%.18e',delimiter=None,newline='\n', header='', footer='', comments='# ', encoding=None)
- frame : 文件、字符串或產(chǎn)生器济锄,可以是.gz或.bz2的壓縮文件 。
- array : 存入文件的數(shù)組 (一維或者二維)蜒茄。
- fmt:寫(xiě)入文件的格式奈梳,例如: %d %.2f %.18e 。
- delimiter : 分割字符串,默認(rèn)是任何空格 循榆。
其他參數(shù)看文檔。
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(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes')
- frame : 文件墨坚、字符串或產(chǎn)生器秧饮,可以是.gz或.bz2的壓縮文件。
- dtype : 數(shù)據(jù)類(lèi)型泽篮,可選 盗尸。
- delimiter : 分割字符串,默認(rèn)是任何空格 帽撑。
- usecols:選取數(shù)據(jù)的列振劳。
- unpack : 如果True,讀入屬性將分別寫(xiě)入不同變量 油狂。
其他看文檔历恐。
注意:usecols寸癌,如果選取前三列,應(yīng)該是usecols=(0,1,2)
弱贼,如果只選取第三列蒸苇,應(yīng)該是usecols=(2,)
。但是吮旅,我嘗試了一下溪烤,不輸入逗號(hào)也可以,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文件只能有效存儲(chǔ)一維和二維數(shù)組 檬嘀。
np.savetxt() np.loadtxt()只能有效存取一維和二維數(shù)組。
多維數(shù)組(任意維度)
存儲(chǔ)
a.tofile(frame, sep='', format='%s')
- frame : 文件责嚷、字符串
- sep : 數(shù)據(jù)分割字符串鸳兽,如果是空串,寫(xiě)入文件為二進(jìn)制罕拂。即揍异,默認(rèn)為空串。
- format : 寫(xiě)入數(shù)據(jù)的格式
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')
讀取
np.fromfile(frame, dtype=float, count=‐1, sep='')
- frame : 文件爆班、字符串
- dtype : 讀取的數(shù)據(jù)類(lèi)型 衷掷。可以發(fā)現(xiàn),我們讀取數(shù)據(jù)的時(shí)候都需要指定數(shù)據(jù)類(lèi)型柿菩,無(wú)論是不是一維二維戚嗅。默認(rèn)為浮點(diǎn)型
- count : 讀入元素個(gè)數(shù), ‐1表示讀入整個(gè)文件
- sep : 數(shù)據(jù)分割字符串枢舶,如果是空串渡处,寫(xiě)入文件為二進(jìn)制
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])
可以發(fā)現(xiàn),讀取到的數(shù)據(jù)維度信息丟失了祟辟。因此医瘫,我們需要將維度信息告訴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]]])
如果我們不指定分隔符旧困,則讀取也不需要指定醇份,此時(shí)存儲(chǔ)的是二進(jìn)制文件。
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]]])
需要注意
- 該方法需要讀取時(shí)知道存入文件時(shí)數(shù)組的維度和元素類(lèi)型
- a.tofile()和np.fromfile()需要配合使用
- 可以通過(guò)元數(shù)據(jù)文件來(lái)存儲(chǔ)額外信息
Numpy文件的便捷存取
np.save(fname, array) 或 np.savez(fname, array)
- fname : 文件名吼具,以.npy為擴(kuò)展名僚纷,壓縮擴(kuò)展名為.npz
- array : 數(shù)組變量
np.load(fname)
- fname : 文件名,以.npy為擴(kuò)展名拗盒,壓縮擴(kuò)展名為.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]]])
這里的存儲(chǔ)怖竭,實(shí)際上也是二進(jìn)制文件,如果只在python中進(jìn)行操作陡蝇,這種方法很方便痊臭,如果需要與其他程序進(jìn)行交互哮肚,則需要視情況存儲(chǔ)為CSV文件等。