numpy数组之存取文件的实现示例
将numpy数组存入文件,有多种文件类型可供选择,对应地就有不同的方法来读写。
下面我将介绍读写numpy的三类文件:
- txt或者csv文件
- npy或者npz文件
- hdf5文件
通过numpy读写txt或csv文件
importnumpyasnp a=np.array(range(20)).reshape((4,5)) print(a) #后缀改为.txt一样 filename='data/a.csv' #写文件 np.savetxt(filename,a,fmt='%d',delimiter=',') #读文件 b=np.loadtxt(filename,dtype=np.int32,delimiter=',') print(b)
缺点:
- 只能保存一维和二维numpy数组,当numpy数组a有多维时,需要将其a.reshape((a.shape[0],-1))后才能用这种方式保存。
- 不能追加保存,即每次np.savetxt()都会覆盖之前的内容。
通过numpy读写npy或npz文件
读写npy文件
importnumpyasnp a=np.array(range(20)).reshape((2,2,5)) print(a) filename='data/a.npy' #写文件 np.save(filename,a) #读文件 b=np.load(filename) print(b) print(b.shape)
优点:
- npy文件可以保存任意维度的numpy数组,不限于一维和二维;
- npy保存了numpy数组的结构,保存的时候是什么shape和dtype,取出来时就是什么样的shape和dtype。
缺点:
- 只能保存一个numpy数组,每次保存会覆盖掉之前文件中存在的内容(如果有的话)。
读写npz文件
importnumpyasnp a=np.array(range(20)).reshape((2,2,5)) b=np.array(range(20,44)).reshape(2,3,4) print('a:\n',a) print('b:\n',b) filename='data/a.npz' #写文件,如果不指定key,那么默认key为'arr_0'、'arr_1',一直排下去。 np.savez(filename,a,b=b) #读文件 c=np.load(filename) print('keysofNpzFilec:\n',c.keys()) print("c['arr_0']:\n",c['arr_0']) print("c['b']:\n",c['b'])
优点:
- npy文件可以保存任意维度的numpy数组,不限于一维和二维;
- npy保存了numpy数组的结构,保存的时候是什么shape和dtype,取出来时就是什么样的shape和dtype;
- 可以同时保存多个numpy数组;
- 可以指定保存numpy数组的key,读取的时候很方便,不会混乱。
缺点:
- 保存多个numpy数组时,只能同时保存,即np.savez(filename,a,b=b)。每次保存会覆盖掉之前文件中存在的内容(如果有的话)。
通过h5py读写hdf5文件
优点:
- 不限numpy数组维度,可以保持numpy数组结构和数据类型;
- 适合numpy数组很大的情况,文件占用空间小;
- 可以通过key来访问dataset(可以理解为numpy.array),读取的时候很方便,不会混乱。
- 可以不覆盖原文件中含有的内容。
简单读取
importnumpyasnp importh5py a=np.array(range(20)).reshape((2,2,5)) b=np.array(range(20)).reshape((1,4,5)) print(a) print(b) filename='data/data.h5' #写文件 h5f=h5py.File(filename,'w') h5f.create_dataset('a',data=a) h5f.create_dataset('b',data=b) h5f.close() #读文件 h5f=h5py.File(filename,'r') print(type(h5f)) #通过切片得到numpy数组 print(h5f['a'][:]) print(h5f['b'][:]) h5f.close()
通过切片赋值
importnumpyasnp importh5py a=np.array(range(20)).reshape((2,2,5)) print(a) filename='data/a.h5' #写文件 h5f=h5py.File(filename,'w') #当数组a太大,需要切片进行操作时,可以不直接对h5f['a']进行初始化; #当之后不需要改变h5f['a']的shape时,可以省略maxshape参数 h5f.create_dataset('a',shape=(2,2,5),maxshape=(None,2,5),dtype=np.int32,compression='gzip') foriinrange(2): #采用切片的形式赋值 h5f['a'][i]=a[i] h5f.close() #读文件 h5f=h5py.File(filename,'r') print(type(h5f)) print(h5f['a']) #通过切片得到numpy数组 print(h5f['a'][:])
同一个hdf5文件可以创建多个dataset,读取的时候按照key来即可。
总结
- csv和txt只能用来存一维或二维numpy数组;
- npy用来存单个numpy数组,npz可以同时存多个numpy数组,两者都不限numpy维度,且都保持numpy数组的shape和dtype,写文件时若原文件存在只能覆盖原文件内容;
- 当numpy数组很大时,最好使用hdf5文件,hdf5文件相对更小;
- 当numpy数组很大时,对整个numpy数组进行运算容易发生MemoryError,那么此时可以选择对numpy数组切片,将运算后的数组保存到hdf5文件中,hdf5文件支持切片索引。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。