算术编码python实现_算术编码(Arithmetic coding)的实现
算术编码例题:
假设信源信号有{A, B, C, D}四个,他们的概率分别为{0.1, 0.4, 0.2, 0.3},如果我们要对CADACDB这个信号进行编码,那么应该怎样进行呢?
准备工作完成之后,我们便可以开始进行编码了。
那么我们首先读入信号:C——因为C在最初始的间隔中是[0.5, 0.7),所以读入C之后我们的编码间隔就变成[0.5, 0.7)了;
紧接着,我们读入的是A,A在初始区间内是占整个区间的前10%,因此对应这个上来也是需要占这个编码间隔的前10%,因此编码区间变为:[0.5, 0.52)了;
再然后是D,因为D占整个区间的70% ~ 100%,所以也是占用这个编码区间的70% ~ 100%,操作后的编码区间为[0.514, 0.52)
……
直到最后将信号量全部读出。
最后,我们将这个操作过程绘制成为一张表:
解码例题:
假设信源信号有{A, B, C, D}四个,他们的概率分别为{0.1, 0.4, 0.2, 0.3},当我们得到的编码是0.5143876的时候,问原始的信号串(7位)是怎样的?
准备工作完成之后,我们现在开始解码:
我们发现,待解码的数据0.5143876在[0.5, 0.7)内,因此,我们解出的第一个码值为C
同理,我们继续计算0.5143876处于[0.5, 0.7)的第一个10%内因此解出的第二个码值为A
……
这个过程持续直到执行七次全部执行完为止。
那么以上的过程我们同样可以列表表示:
作业:对任一概率序列,实现算术编码,码长不少于16位,不能固定概率,语言自选。
基于Python实现:
from collections import Counter #统计列表出现次数最多的元素
importnumpy as npprint("Enter a Sequence\n")
inputstr=input()print (inputstr + "\n")
res= Counter(inputstr) #统计输入的每个字符的个数,res是一个字典类型
print(str(res))#print(res)#sortlist = sorted(res.iteritems(), lambda x, y : cmp(x[1], y[1]), reverse = True)#print sortlist
M=len(res)#print (M)
N = 5A= np.zeros((M,5),dtype=object) #生成M行5列全0矩阵
#A = [[0 for i in range(N)] for j in range(M)]
reskeys= list(res.keys()) #取字典res的键,按输入符号的先后顺序排列#print(reskeys)
resvalue = list(res.values()) #取字典res的值
totalsum = sum(resvalue) #输入一共有几个字符
#Creating Table
A[M-1][3] =0for i inrange(M):
A[i][0]= reskeys[i] #第一列是res的键
A[i][1] = resvalue[i] #第二列是res的值
A[i][2] = ((resvalue[i]*1.0)/totalsum) #第三列是每个字符出现的概率
i=0
A[M-1][4] = A[M-1][2]while i < M-1: #倒数两列是每个符号的区间范围,与输入符号的顺序相反
A[M-i-2][4] = A[M-i-1][4] + A[M-i-2][2]
A[M-i-2][3] = A[M-i-1][4]
i+=1
print(A)#Encoding
print("\n------- ENCODING -------\n")
strlist=list(inputstr)
LEnco=[]
UEnco=[]
LEnco.append(0)
UEnco.append(1)for i inrange(len(strlist)):
result= np.where(A == reskeys[reskeys.index(strlist[i])]) #满足条件返回数组下标(0,0),(1,0)
addtollist = (LEnco[i] + (UEnco[i] - LEnco[i])*float(A[result[0],3]))
addtoulist= (LEnco[i] + (UEnco[i] - LEnco[i])*float(A[result[0],4]))
LEnco.append(addtollist)
UEnco.append(addtoulist)
tag= (LEnco[-1] + UEnco[-1])/2.0 #最后取区间的中点输出
LEnco.insert(0,"Lower Range")
UEnco.insert(0,"Upper Range")print(np.transpose(np.array(([LEnco],[UEnco]),dtype=object))) #np.transpose()矩阵转置
print("\nThe Tag is \n")print(tag)#Decoding
print("\n------- DECODING -------\n")
ltag=0
utag= 1decodedSeq=[]for i inrange(len(inputstr)):
numDeco= ((tag - ltag)*1.0)/(utag - ltag) #计算tag所占整个区间的比例
for i inrange(M):if (float(A[i,3]) < numDeco < float(A[i,4])): #判断是否在某个符号区间范围内
decodedSeq.append(str(A[i,0]))
ltag= float(A[i,3])
utag= float(A[i,4])
tag=numDecoprint("The decoded Sequence is \n")print("".join(decodedSeq))
Arithmetic coding Code
参考:
算术编码python实现_算术编码(Arithmetic coding)的实现相关推荐
- 独热编码python实现_详解深度学习中的独热编码
很多人开始接触深度学习,数据处理遇到第一个专业英文术语就是one-hot encode(独热编码),很多初学者就会迷茫,这个东西是什么意思,其实说的直白点所谓的独热编码最重要的就是把一组字符串或者数字 ...
- inputstreamreader 编码不完整_素材编码对剪辑效率的影响
这次说说在项目的剪辑阶段关于编码的一些注意事项. 压缩编码会拖慢剪辑速度 大多数中低端摄像机都使用其于时间压缩的编码来进行录制,也称为Long GOP压缩.这种编码对于缩小文件体积很有用,但是计算机不 ...
- 动力电池编码追溯系统_学习编码时如何保持动力(10条可行的技巧!)
动力电池编码追溯系统 This post was originally published on Coder-Coder.com. 该帖子最初发布在Coder-Coder.com上 . Does th ...
- 独热编码python实现_独热编码(one-hot coding)
1 为什么需要独热编码? 直接上案例,一份数据,特征为["颜色", "尺码", "喜欢度", "类别"],具体数据为[[ ...
- 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)
香农编码,费诺编码,赫夫曼编码(python实现) 开始参考了网上其他人的代码,但后来都发现要么代码有错误,要么输出结果不符合自己的预期,于是就重新实现了一下,代码仍存在一些小问题,但是能够满足作业要 ...
- 信息论与编码 python实现 费诺编码 代码详解
先给出整体代码 要copy的朋友可以拿去 下面给出 from math import * class FanoCod: #费诺编码code_dict = {}x_p = {}x_plist = []A ...
- java中打开特定编码的文本_指定编码写入和读取文件内容
为了完美解决你的问题,特分享我自己的FileKit.java工具给你. 你只需要使用createFile方法,传入一行一个的List对象就可以生成了,目录不存在这些都判断了,只要你的目录可写就行了. ...
- python解码和编码_Python的解码和编码
使用Python语言做网络爬虫或者写自动化脚本时,总会遇到"中文乱码"的问题,很是头疼.很多"中文乱码"的问题是跟Python的解码/编码有关,所以今天和大家说 ...
- 算术编码(Arithmetic Coding)源代码
Ian H. Witten.Radford M. Neal和John G. Cleary在1987年发表了一篇启发性的论文.论文中描述了一种基于整数运算的通用算术编码器,而且还给出了由计算错误导致的效 ...
- (Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)
1.代码功能 输入:一个字符串 输出: codeword(码值) codeword所占的位数 2.代码框图 3.代码超详解 统计字符串中的字符种类,调用函数,放入数组b中. b=unique(str1 ...
最新文章
- mac 使用homebrew 安装mysql
- Virtex-6系列FPGA的CLB
- STM32使用串口IDLE中断的两种接收不定长数据的方式
- ASP.NET数据库访问系列教程01-概述篇 创建数据访问层(下)
- CSDN博客标题和目录的一点思考
- 【Python笔记】字符串常见操作
- penpyxl 格式_【上海校区】数据集.npy格式与png格式互换
- x为正变数,求y=x^3/(x^4+4)的最大值
- 百度竞价初学者怎样才能建立一个好的思路
- web页面防盗链功能使用--request.getHeader(Referer)
- 《淘宝网开店 SEO 推广 营销 爆款 实战200招》——1.3 网上开店的热门行业有哪些...
- php 脚本调试,PHP 调试脚本
- 最全LinuxC语言系统开发资源视频资源
- oracle 误删除数据,回退表数据
- 电力系统计算机辅助分析知乎,电力系统计算机辅助分析
- APMServ 使用
- LINE登录手机后怎样更换别个账号_LINE是什么?怎么开LINE广告账户推广运营?
- .net 导出excel_C# 导出 Excel 的 6 种简单方法!你会几种?
- 如何去除图片中的文字水印
- 基于cocos2dx的横版动作游戏制作(二)