我有一个很长的项目数组(4700(,与另一个列表中的设置相比,这些项目最终将为1或0。我希望能够构造一个单一的整数/字符串项,我可以将其存储在一些元数据中,以便以后可以访问它,以便唯一地识别进入其中的项的组合。
我正在用Python写这一切。我正在考虑做一些类似zlib压缩加十六进制转换的事情,但我对如何进行逆变换感到困惑。因此,假设bin_string是1和0的字符串数组,它应该看起来像这个
import zlib
#example bin_string, real one is much longer
bin_string="1001010010100101010010100101010010101010000010100101010"
compressed = zlib.compress(bin_string.encode())
this_hex = compressed.hex()
然后我可以将this_hex保存到元数据中。问题是,如何从十六进制值中获取原始bin_string
?我在数值方法等方面有很多Python经验,但在压缩方面很少,所以任何基本的见解都非常有价值。
只需对每个操作执行相反的操作。此:
zlib.decompress(bytearray.fromhex(this_hex)).decode()
将返回您的原始字符串。
简单地将您的比特编码为字节字符串中的比特,再加上终止的一个比特后跟零来填充最后一个字节,这将更快,甚至可能导致更好的压缩。这将是7个字节,而不是从zlib.compress()
得到的22个字节。只有当0或1有很强的偏差,和/或0和1中有重复的模式时,zlib才会做得更好。
至于元数据的编码,Base64将比十六进制更紧凑。你的例子是lKVKVKoKVQ==
。
您应该尝试使用numpy 的.savez_compressed((方法
将你的简单数组转换为numpy数组,然后使用这个-
numpy.savez_compressed("filename.npz")
使用
numpy.load()
加载.npz文件