python 压缩字符串_python zlib - 压缩字符串的大小与香农熵

博客探讨了如何计算zlib压缩算法的压缩率,并通过实例比较了实际压缩结果与理论上的香农熵。作者生成随机二进制序列并压缩,发现压缩比高于预期,这引发对压缩算法效率和信息理论的讨论。实验结果显示,对于1's和0's的序列,每增加一个位,压缩后的序列平均只增加了约0.155位的信息,而非预期的1位。
部署运行你感兴趣的模型镜像

我试图更好地理解压缩算法的输出 - 如zlib - 如何与一个人的理论预期相比较 . 所以我有几个问题 .

(1)首先,我想检查一下我是否正确计算了压缩率 . 假设我想压缩1000个数组,我可以执行以下操作

# encode the array such that len(s) == 1000 bytes

s = np.ones(1000, dtype='uint8').tostring()

# compress using the python zlib (deflate)

comp_s = zlib.compress(s, 9)

# giving comp_s = 'x\xdacd\x1c\x05\xa3`\x14\x0cw\x00\x00\xa7e\x03\xe9'

comp_ratio = len(comp_s)/len(s)

# giving 17/1000

因此我的第一个问题是: comp_s 编码使得它的长度对应于字节数?我无法弄清楚这个字符串是如何编码的 . 如果我做 sys.getsizeof(comp_s) 我发现它的大小是54字节而不是17字节?因为 getsizeof 返回python对象的大小所以它肯定高估了字符串的大小,我是否正确假设 sys.getsizeof(s) - sys.getsizeof('') 是正确的方法?它似乎至少产生与 len() 相同的结果 .

(2)压缩序列的大小应大于(或等于)其香农熵 . 对于以50:50概率发生的1 's and 0' s的随机二进制序列,每个数字的信息数是1位(根据定义 h = - p log p - (1-p)log(1-p) ) . 由于真正的随机序列是不可压缩的,如果我生成一个长度为 n 的随机二进制序列,我希望通过添加一个随机数字,得到的 n+1 长序列在压缩后平均会大1位 .

当我做以下

rawsize = range(1, 100000, 1000)

compsize = []

for l in rawsize:

s = np.random.randint(0, 2, l, dtype='uint8').tostring()

comp_s = zlib.compress(s, 9)

# note: I compress again to achieve better compression when l is large

comp_s = zlib.compress(comp_s, 9)

compsize.append(len(comp_s))

如果我绘制 compsize / rawsize ,我发现曲线接近 0.155 周围的常数值(如果我正确解释),通过添加一位数,信息量增加 0.155 -bits . 我不明白这一点,因为看起来压缩比理论预期要好得多 .

为了进一步理解这一点,我还比较了压缩的字符串大小,对于1 's and 0' s的二进制序列的情况,其中1的概率发生在概率 0

显然有一些我没有考虑的标准化因素,但我无法弄清楚它的基本原理 . 我还尝试使用 16 , 32 和 64 位无符号整数对原始序列进行编码,发现比率 compsize / rawsize 分别大致为 0.176 , 0.2 , 0.23 ,所以看起来像是在1 's and 0' s的表示中添加一个字节我们贡献了大约 0.25 位的额外信息,这也很奇怪 .

任何建议都非常有用!

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值