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文件支持切片索引。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。