我有一个仅包含值 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/