保存numpy.savez
文件的.npz
的python文档是:
.npz文件格式是以文件中包含的变量命名的压缩文件存档。档案未压缩,档案中的每个文件都包含一个.npy格式的变量。 [...]
在加载时打开保存的.npz文件时,NpzFile对象为 回到。这是一个类似于字典的对象,可以查询 其数组列表(具有.files属性),以及该数组的列表 自己。
我的问题是:numpy.savez
的意义是什么?
是保存多个数组的一种更简洁的版本(更短的命令),还是在保存/读取过程中有提速?它占用更少的内存吗?
答案 0 :(得分:6)
回答问题有两个解释部分。
正如我们已经从文档中读取的那样,.npy
格式为:
NumPy中的标准二进制文件格式,用于将 单 个任意NumPy数组保留在磁盘上。 ...该格式旨在在达到其有限目标的同时尽可能地简单。 (sources)
.npz
只是一个
将 多个 数组组合到一个文件中的简单方法,可以使用ZipFile包含多个“
.npy
”文件。对于这些档案,我们建议使用文件扩展名“.npz
”。 (sources)
因此,.npz
只是一个包含多个“ .npy
”文件的ZipFile。 可以对该ZipFile进行压缩(通过使用np.savez_compressed
)或未压缩(通过使用np.savez
)。
类似于类似Unix的系统中的tarball archive file,其中tarball文件可以只是一个未压缩的存档文件,其中包含其他文件,也可以是压缩文件,通过与各种压缩程序结合使用(gzip
bzip2
等)
Numpy还提供different APIs来产生这些二进制文件输出:
np.save
--->将数组保存为NumPy .npy
格式的二进制文件np.savez
->以未压缩 .npz
格式将多个数组保存到单个文件中np.savez_compressed
->将多个数组以压缩 .npz
格式保存到单个文件中np.load
->从.npy
,.npz
或腌制的文件中加载数组或腌制的对象如果我们浏览Numpy的源代码under the hood,则有:
def _savez(file, args, kwds, compress, allow_pickle=True, pickle_kwargs=None):
...
if compress:
compression = zipfile.ZIP_DEFLATED
else:
compression = zipfile.ZIP_STORED
...
def savez(file, *args, **kwds):
_savez(file, args, kwds, False)
def savez_compressed(file, *args, **kwds):
_savez(file, args, kwds, True)
然后回到问题:
如果仅使用np.save
,则在.npy
格式之上没有更多的压缩,只有一个存档文件可以方便地管理多个相关文件。
如果使用np.savez_compressed
,则磁盘上的内存当然会减少,因为执行压缩作业需要更多的CPU时间(即,速度稍慢)。
答案 1 :(得分:0)
主要优点是数组是延迟加载的。也就是说,如果您的npz
文件包含100个数组,则可以加载该文件而无需实际加载任何数据。如果请求单个数组,则仅加载该数组的数据。
npz
文件的一个缺点是它们无法进行内存映射(使用load(<file>, mmap_mode='r')
),因此对于大型数组,它们可能不是最佳选择。对于数组具有共同形状的数据,建议您参考structured arrays。它们可以进行内存映射,允许使用类似dict的语法(即arr['field']
)访问数据,并且在内存方面非常有效。