Numpy命名空间问题
我现在有一个这样的函数:
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
这也没有成功。在这个函数里(或者我的程序整体上),我没有提到过一个叫“quo”的变量,我也看不出我的代码哪里会影响到numpy。
2 个回答
这里有个小提示。你不应该调用 polydiv
,而是应该用 Python 的 divmod
操作符来做 divmod(block_poly, gen_poly)
。原代码出错的地方确实是在 __rtruediv__
,但这其实是个意外。这个函数调用把除法当成了两个0次多项式来处理,而因为 polynomial.py
文件顶部有 from __future__ import division
,所以它尝试进行真正的除法。想要更直接地看到这个错误,可以用 operator.truediv(block_poly, gen_poly)
。
这是numpy中的一个错误。在__rtruediv__
这个功能的实现中,你可以在这个链接找到具体代码:https://github.com/numpy/numpy/blob/master/numpy/polynomial/_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。