我目前有以下职能:
def add_bch(compressed):
k = 16 #input blocks of 16 bits.
prim_poly = Poly([1, 0, 1, 0, 0, 1]) # x^5+x^2+1
prim_poly_3 = Poly([1, 0, 1, 1, 1, 1]) #prim_poly^3 -> x^5+x^4+x^3+x^2+1
prim_poly_5 = Poly([1, 1, 1, 0, 1, 1]) #prim_poly^5 -> x^5+x^4+x^2+x+1
gen_poly = npp.polymul(npp.polymul(prim_poly, prim_poly_3), prim_poly_5)[0]
compressed = add_padding(compressed, k)
compressed_with_ecc = []
for i in range(len(compressed)/k):
block = compressed[(k*i):(k*(i+1))]
block_poly = bitstr_to_poly(block)
quotient, remainder = npp.polydiv(block_poly, gen_poly)
compressed_with_ecc.append(poly_to_bitstr(block. remainder))
return Bits().join(compressed_with_ecc)有关的进口报表如下:
from bitstring import BitArray, Bits
import numpy.polynomial.polynomial as npp
from numpy.polynomial import Polynomial as Poly当我运行代码时,我得到了错误:
bash-4.2$ python send_mess < pg2600.txt
Traceback (most recent call last):
File "send_mess", line 113, in <module>
encoded = add_bch(compressed)
File "send_mess", line 105, in add_bch
quotient, remainder = npp.polydiv(block_poly, gen_poly)
File "/usr/lib64/python2.7/site-packages/numpy/polynomial/polynomial.py", line 408, in polydiv
return c1/c2[-1], c1[:1]*0
File "<string>", line 373, in __rtruediv__
UnboundLocalError: local variable 'quo' referenced before assignment我知道numpy导入会导致命名空间问题,但是尽管尝试,我还是找不出这里的问题所在。我想到的一件事是,这两个numpy导入语句可能会发生冲突,但在我看来,它们应该彼此分开,就像应该这样:
numpy
...
polynomial
...
Polynomial
polynomial
...
polymul
polydiv
...
...
...然而,我确实尝试过:
from bitstring import BitArray, Bits
import numpy.polynomial as npp有了所有相关的名字更改,都没有用。我也尝试直接导入所有的东西,所以:
from bitstring import BitArray, Bits
from numpy.polynomial.polynomial import polymul, polydiv
from numpy.polynomial import Polynomial as Poly这也不起作用。在函数中的任何一点(或者我的程序)中,我都没有提到一个变量,而且我看不出我的代码在哪里可以踩到numpy的脚趾。
发布于 2014-04-21 13:39:09
这是个小虫子。在__rtruediv__ at polybase.py#L421的实现中,可以看到如果len(self.coef)不是1,则语句
return self.__class__(quo, self.domain, self.window)执行,但未定义quo。
下面是一个生成错误的简单示例:
In [1]: import numpy.polynomial.polynomial as npp
In [2]: p1 = npp.Polynomial([1,2])
In [3]: p2 = npp.Polynomial([3,4])
In [4]: npp.polydiv(p1, p2)
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-4-00c25f56fb20> in <module>()
----> 1 npp.polydiv(p1, p2)
/Users/warren/anaconda/lib/python2.7/site-packages/numpy/polynomial/polynomial.pyc in polydiv(c1, c2)
406 len2 = len(c2)
407 if len2 == 1 :
--> 408 return c1/c2[-1], c1[:1]*0
409 elif len1 < len2 :
410 return c1[:1]*0, c1
/Users/warren/anaconda/lib/python2.7/site-packages/numpy/polynomial/polynomial.pyc in __rtruediv__(self, other)
UnboundLocalError: local variable 'quo' referenced before assignment我在这里报道了这个问题:https://github.com/numpy/numpy/issues/4631。
发布于 2014-04-22 02:46:02
这里有张便条。您不应该调用polydiv,而应该使用Pythondivmod操作符执行divmod(block_poly, gen_poly)。给出的代码的错误确实在__rtruediv__中,但这是一个意外。函数调用将除法处理为具有多项式系数的二次0多项式,并且由于polynomial.py文件顶部有from __future__ import division,所以尝试进行真正的除法。获得错误的一个更直接的方法是operator.truediv(block_poly, gen_poly)。
https://stackoverflow.com/questions/23186008
复制相似问题