我试图在Python中实现一个Reed-Solomon编码器解码器,支持解码擦除和错误,这让我发疯.
该实现目前仅支持解码错误或仅解码,但不能同时解码两者(即使它低于2*错误+删除的理论界限<=(nk)).
从Blahut的论文(这里和这里),似乎我们只需要用擦除定位多项式初始化错误定位多项式,以隐式计算Berlekamp-Massey内的勘误定位多项式.
这种方法部分适用于我:当我有2*错误+删除<(nk)/ 2时它可以工作,但事实上在调试之后它只能起作用,因为BM计算错误定位多项式,它获得与擦除定位多项式完全相同的值(因为我们低于仅错误校正的限制),因此它被galois字段截断,我们最终得到了擦除定位多项式的正确值(至少我理解它的方式,我可能是错的).
然而,当我们超过(nk)/ 2时,例如如果n = 20且k = 11,那么我们有(nk)= 9个擦除的符号我们可以纠正,如果我们输入5个擦除然后BM就会出错.如果我们输入4个擦除+ 1个错误(我们仍然远低于界限,因为我们有2*错误+删除+ 2 + 4 = 6 <9),BM仍然出错.
我实现的Berlekamp-Massey的精确算法可以在本演示文稿中找到(第15-17页),但是在这里和这里可以找到非常相似的描述,在这里我附上了数学描述的副本:

现在,我将这个数学算法几乎完全复制到Python代码中.我想要的是扩展它以支持擦除,我尝试通过使用擦除定位器初始化错误定位器sigma:
def _berlekamp_massey(self, s, k=None, erasures_loc=None):
'''Computes and returns the error locator polynomial (sigma) and the
error evaluator polynomial (omega).
If the erasures locator is specified, we will return an errors-and-erasures locator polynomial and an errors-and-erasures evaluator polynomial.
The parameter s is the syndrome polynomial (syndromes encoded in …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化Reed-Solomon编码器,这实际上只是对Galois Fields 2 ^ 8的多项式除法运算(这意味着值环绕超过255).事实上,代码与Go中的代码非常相似:http://research.swtch.com/field
这里使用的多项式除法算法是合成除法(也称为Horner方法).
我尝试了一切:numpy,pypy,cython.我得到的最佳性能是使用pypy和这个简单的嵌套循环:
def rsenc(msg_in, nsym, gen):
'''Reed-Solomon encoding using polynomial division, better explained at http://research.swtch.com/field'''
msg_out = bytearray(msg_in) + bytearray(len(gen)-1)
lgen = bytearray([gf_log[gen[j]] for j in xrange(len(gen))])
for i in xrange(len(msg_in)):
coef = msg_out[i]
# coef = gf_mul(msg_out[i], gf_inverse(gen[0])) // for general polynomial division (when polynomials are non-monic), we need to compute: coef = msg_out[i] / gen[0]
if coef != 0: # coef 0 is normally undefined so we manage …Run Code Online (Sandbox Code Playgroud) 我想做一个函数来推广矩阵乘法.基本上,它应该能够进行标准矩阵乘法,但它应该允许通过任何其他函数更改两个二元运算符product/sum.
目标是在CPU和内存方面尽可能高效.当然,它总是比A*B效率低,但操作员的灵活性才是最重要的.
A = randi(10, 2, 3);
B = randi(10, 3, 4);
% 1st method
C = sum(bsxfun(@mtimes, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% Alternative: C = bsxfun(@(a,b) mtimes(a',b), A', permute(B, [1 3 2]))
% 2nd method
C = sum(bsxfun(@(a,b) a*b, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% 3rd method (Octave-only)
C = sum(permute(A, [1 3 2]) .* permute(B, [3 2 1]), 3)
% 4th method (Octave-only): multiply nxm A with nx1xd B to …Run Code Online (Sandbox Code Playgroud) 我有一个PDF文件,其中包含有价值的文字信息.
问题是我无法提取文本,我得到的只是一堆乱码.如果我将PDF阅读器中的文本复制并粘贴到文本文件中,也会发生同样的情况.即使文件 - >在Acrobat Reader中另存为文本也会失败.
我已经使用了所有可以拿到的工具,结果是一样的.我相信这与字体嵌入有关,但我不知道到底是什么?
我的问题:
我有一个CSV文件格式如下:
somefeature,anotherfeature,f3,f4,f5,f6,f7,lastfeature
0,0,0,1,1,2,4,5
Run Code Online (Sandbox Code Playgroud)
我尝试将其视为熊猫系列(使用Python 2.7的pandas每日快照).我尝试了以下方法:
import pandas as pd
types = pd.Series.from_csv('csvfile.txt', index_col=False, header=0)
Run Code Online (Sandbox Code Playgroud)
和:
types = pd.read_csv('csvfile.txt', index_col=False, header=0, squeeze=True)
Run Code Online (Sandbox Code Playgroud)
但两者都不起作用:第一个产生随机结果,第二个只是导入DataFrame而不会挤压.
看起来像pandas只能识别为系列格式如下的CSV格式:
f1, value
f2, value2
f3, value3
Run Code Online (Sandbox Code Playgroud)
但是当功能键位于第一行而不是列时,pandas不想挤压它.
我还能尝试别的吗?这种行为是有意的吗?
我正在使用Python + Tornado创建一个Web应用程序,它基本上为用户提供文件.我没有数据库.
如果文件可用,则直接拾取和提供文件,如果没有,则立即生成.
我希望以异步方式提供客户端,因为某些文件可能已经可用,而其他文件需要生成(因此需要等待,我不希望它们阻止其他用户).
我有一个管理文件选择或生成的类,我只需要从Tornado调用它.
实现这一目标的最佳方法(在CPU和RAM上最有效)是什么?我应该使用线程吗?一个子流程?一个简单的gen.Task喜欢这个吗?
另外,我希望我的实现能够在Google App Engines上运行(我认为它们不允许生成子流程吗?).
我对异步Web服务比较新,所以欢迎任何帮助.
我想在 Python 中发送 UDP 数据包并指定源端口但不绑定。
与 hping3 等效:
hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr
Run Code Online (Sandbox Code Playgroud)
我尝试过做这样的事情:
hping3 -s $sourceport -p $remoteport --udp --file message.bin -d 1024 -c 1 $remoteaddr
Run Code Online (Sandbox Code Playgroud)
当然,Python 会尝试绑定,但它不起作用。现在如果我不绑定,我可以这样做:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((SHOST, SPORT))
Run Code Online (Sandbox Code Playgroud)
消息已发送,但现在源端口未定义。
有人有想法吗?
编辑:扩展描述:我的 python 脚本补充了另一个应用程序,该应用程序是绑定到定义端口(1024 以上)的 UDP 服务器。我的脚本只需要将 UDP 数据包发送到远程服务器,但使用与本地 UDP 服务器相同的源端口,以便远程 UDP 服务器认为本地 UDP 服务器是数据包的作者,并将继续使用它进行传输。
我想我还必须说,这是一个完全合法的应用程序,与任何黑客攻击完全无关(事实上,它已经可以与 hping3 一起使用,但我想删除这种依赖关系)。
编辑2 :解决方案在Nos的答案下面的评论中:
使用 pyip python 包并创建一个原始套接字。不要忘记是 root,因为只有 root 才能发送原始数据包(这不是 Python 的限制,而是操作系统的限制,这是为了防止安全问题,因此要以用户身份发送原始数据包,您需要调整操作系统配置)。
我正在尝试使用快速傅立叶变换(fft)实现快速多项式除法.
这是我到目前为止所得到的:
from numpy.fft import fft, ifft
def fft_div(C1, C2):
# fft expects right-most for significant coefficients
C1 = C1[::-1]
C2 = C2[::-1]
d = len(C1)+len(C2)-1
c1 = fft(list(C1) + [0] * (d-len(C1)))
c2 = fft(list(C2) + [0] * (d-len(C2)))
res = list(ifft(c1-c2)[:d].real)
# Reorder back to left-most and round to integer
return [int(round(x)) for x in res[::-1]]
Run Code Online (Sandbox Code Playgroud)
这适用于相同长度的多项式,但如果长度不同则结果是错误的(我对RosettaCode的 extended_synthetic_division()函数进行基准测试):
# Most signficant coefficient is left
N = [1, -11, 0, -22, 1]
D = [1, -3, 0, …Run Code Online (Sandbox Code Playgroud) 当Pandas在HDFStore上工作时(例如:.mean()或.apply()),它是否将内存中的完整数据作为DataFrame加载,还是作为Serie逐个记录处理?
我必须处理大数据文件,我可以指定数据文件的输出格式.
我打算使用Pandas处理数据,我想设置最佳格式,以便最大化性能.
我已经看到panda.read_table()已经走了很长一段路,但它仍然至少需要与我们想要读取的原始文件大小一样多的内存(实际上至少是内存的两倍)才能转换为DataFrame .这可能适用于高达1 GB但高于1 GB的文件?这可能很难,特别是在在线共享机器上.
但是,我已经看到,现在Pandas似乎支持使用pytables的HDF表.
我的问题是:当我们在整个HDF表上进行操作时,Pandas如何管理内存?例如.mean()或.apply().它是首先在DataFrame中加载整个表,还是直接从HDF文件处理数据而不存储在内存中?
问题:磁盘使用情况下hdf5格式是否紧凑?我的意思是,它像xml一样冗长或更像JSON吗?(我知道有索引和东西,但我在这里对数据的简单描述感兴趣)
我在 Windows 7 64 位上运行 Python 2.7 32 位(Anaconda)。
我想使用 ctypes 进行 win32 API 调用,但我有一个非常奇怪的问题:我可以import ctypes,但不能import ctypes.windll,我收到以下错误:
ImportError: No module named windll
Run Code Online (Sandbox Code Playgroud)
我已经爬行了网络,但是我没有找到任何与我的问题类似的内容(要么是根本无法导入ctypes,要么是您尝试导入的DLL中存在错误)。
有人知道我做错了什么吗?
python ×6
pandas ×2
asynchronous ×1
class ×1
csv ×1
ctypes ×1
cython ×1
fft ×1
file-format ×1
function ×1
galois-field ×1
hdf5 ×1
ifft ×1
large-data ×1
math ×1
matlab ×1
matrix ×1
memory ×1
numpy ×1
octave ×1
optimization ×1
pdf ×1
port ×1
pypy ×1
reed-solomon ×1
series ×1
sockets ×1
tornado ×1
udp ×1