python 将numpy数组保存为较大对象的一部分?

2fjabf4q  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(129)

我正在做一些与图像相关的ML任务,作为预处理的结果,我正在创建一个包含重要元数据属性的类的对象,沿着一个3d numpy图像数据数组。我想减少这些对象的大小,并提高它们的读写速度。
目前,对象是使用pickle保存为文件的,但这似乎不是最有效的方法。dill库应该在保存numpy项方面更好,但由于我需要处理许多文件,总体性能较低,这似乎没有帮助。
我也听说过numpy.save方法,但我不确定如何将其作为pickle过程的一部分来实现,我使用pickle.dump和pickle.load来pickle项目。

xqkwcwgp

xqkwcwgp1#

pickle依赖于每个对象的“pickle”方法,无论对象是列表、dict还是其他对象。numpy数组的pickle格式与www.example.com基本相同np.save。因此速度和文件大小应该相似。相反,np.save使用pickle来格式化非数组参数或包含对象的数组(注意save/load中的allow_pickle参数)。

In [57]: import pickle
In [58]: x = np.ones((100,100,100))
In [59]: np.save('test.npy',x)
In [60]: !dir test.npy
 Volume in drive C is Windows
 Volume Serial Number is 4EEB-1BF0

 Directory of C:\Users\paul

01/18/2023  12:57 PM         8,000,128 test.npy
               1 File(s)      8,000,128 bytes
               0 Dir(s)  18,489,139,200 bytes free

In [61]: astr=pickle.dumps(x)
In [62]: len(astr)
Out[62]: 8000163

我看到一些ML项目使用HDF5/h5py来保存模型和数据,但我没有太多的关注,我回答了h5py的问题,但还没有在速度和压缩很重要的大型项目中尝试过。
多个numpy数组也可以用np.savez保存(在压缩版本中),这会将每个数组保存为一个npy文件。
np.save是保存数组最有效的方法。它基本上由一个小的头块和数组数据缓冲区的字节副本组成。除非数组有很多相同的值,否则压缩空间很小。

相关问题