numpy包.npz组件文件

时间:2018-03-18 07:26:00

标签: python numpy

如何将数据写入.npz文件而不删除以前的数据?

我正在使用python numpy包,我使用savez()来保存变量。

但是,每次我将信息保存到文件时,都会删除以前的信息。例如,假设我有

savez('file',a=a)

然后如果我使用

savez('file',b=b)

它将删除整个文件和

load('file.npz').keys()

只会返回'b'。

有没有选项可以简单地将变量“追加”到文件中删除文件?即,有没有办法简单地添加像'append=true'这样的参数,以便它

savez('file',b=b,'append=true')

不会删除“a”?

2 个答案:

答案 0 :(得分:1)

np.savez创建一个zip存档。虽然可以在追加模式下打开这样的存档,但savez不提供该选项(即,它没有记录,也没有隐藏代码)。

但是savez使用np.save创建了组件文件(从技术上讲,几个调用级别已关闭),并将它们打包在zip中。所以我们可以自己做。

In [744]: import zipfile

In [746]: a=np.arange(10)
In [747]: b=np.zeros((10,10))
In [748]: np.savez('test.npz', a=a, b=b)

使用zipfile或操作系统工具查看存档:

In [750]: f = zipfile.ZipFile('test.npz', mode='a')  # note append mode
In [751]: f.infolist()
Out[751]: 
[<ZipInfo filename='b.npy' filemode='-rw-------' file_size=928>,
 <ZipInfo filename='a.npy' filemode='-rw-------' file_size=168>]

现在save另一个数组,并使用zipfile write

In [752]: np.save('c.npy',np.ones((2,3)))
In [753]: f.write('c.npy')
In [754]: f.infolist()
Out[754]: 
[<ZipInfo filename='b.npy' filemode='-rw-------' file_size=928>,
 <ZipInfo filename='a.npy' filemode='-rw-------' file_size=168>,
 <ZipInfo filename='c.npy' filemode='-rw-rw-r--' file_size=176>]
In [755]: f.close()

使用load进行测试:

In [757]: d = np.load('test.npz')
In [758]: list(d.keys())
Out[758]: ['b', 'a', 'c']
In [759]: d['c']
Out[759]: 
array([[1., 1., 1.],
       [1., 1., 1.]])

因此在初始调用中添加了ab,而稍后添加了c。目录中仍存在c.npy文件。这可以删除。

简而言之,np.savez是一种通过一次调用保存多个数组的简单方法。使用zipfile时,它无法直接访问其所有灵活性,例如附加或更新文件。如果您需要这种灵活性,请直接使用np.savezipfile

答案 1 :(得分:0)

np.savez_compressed()允许将多个数组保存为压缩.npz格式的单个文件:

np.savez_compressed('/path/to/file.npz',a=a, b=b)