python-2.7 - NumPy 的 : Translating elements increases size of file by a lot (factor of 8)

标签 python-2.7 numpy h5py

我有一个仅包含值 0、1 和 2 的 3D 数组,我想将这些值分别转换为 0,128 和 255。我环顾四周,这个线程 ( Translate every element in numpy array according to key) 似乎是可行的方法。

所以我尝试实现它并且它起作用了,代码的相关部分可以在下面看到(我从 h5 文件读取数据和向 h5 文件写入数据,但我怀疑这很重要,我只是提到它以防万一)

#fetch dataset from disk
f = h5py.File('input/A.h5','r') #size = 572kB

#read and transform array
array = f['data'].value  #type = numpy.ndarray
my_dict = {1:128, 2:255, 0:0}
array=np.vectorize(my_dict.get)(array)

#write translated dataset to disk
h5 = h5py.File('output/B.h5', driver=None) #final size = 4.5MB
h5.create_dataset('data', data=array)  
h5.close()

问题是,输入文件 (A.h5) 的大小为 572kB,输出文件 (B.h5) 的大小是它的 8 倍 (4.5MB)。

这是怎么回事?我有另一个具有相同维度的数组,其中充满了从 0 到 255 的值,它的大小也是 572kB,因此数字越大无关紧要。我的第一个猜测是 python 可能正在创建对象而不是 int,我尝试转换为 int 但大小保持不变。

旁注:如果我使用 3 个缩进 for 循环转换数据,那么大小将保持在 572kB(但代码要慢得多)

最佳答案

通过将数组写回为 int64(其中原始数组存储为 uint8),您可能会得到 8 倍。你可以试试:

array=np.vectorize(my_dict.get)(array).astype(np.uint8)

然后保存到h5...

正如@Jaime 指出的那样,您可以通过告诉 vectorize 您想要的数据类型直接保存数组副本:

array=np.vectorize(my_dict.get, otypes=[np.uint8])(array)

关于python-2.7 - NumPy 的 : Translating elements increases size of file by a lot (factor of 8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43606592/

相关文章:

python - 你能在 python 中轻松创建一个类似列表的对象,它使用类似描述符的东西来描述它的项目吗?

python - X*Y 项的平均值并保持 numpy 数组的维度

如果缺少,Python 将元素添加到列表中的列表

python-3.x - 如何在 pyinstaller 的 spec 文件内包含多个隐藏导入

python - 将数据写入调整大小的 hdf5 数据集会以令人惊讶的方式失败

python - python中是否存在空类?

python点击,使选项值可选

python - 连接列表中的特定元组

python - 使用自定义架构构建 Matrix 的最快方法

python - 从 python 加载 .mat 文件