加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何计算galois字段上的numpy数组?

发布时间:2020-12-16 21:37:48 所属栏目:Python 来源:网络整理
导读:我想在galois字段(GF4)上使用numpy数组. 所以,我将GF4类设置为数组元素. 它适用于数组整数计算,但它不适用于数组数组计算. import numpyclass GF4(object): """class for galois field""" def __init__(self,number): self.number = number self.__addL__ =
我想在galois字段(GF4)上使用numpy数组.
所以,我将GF4类设置为数组元素.
它适用于数组整数计算,但它不适用于数组数组计算.
import numpy

class GF4(object):
    """class for galois field"""
    def __init__(self,number):
        self.number = number
        self.__addL__ = ((0,1,2,3),(1,3,2),(2,1),(3,0))
        self.__mulL__ = ((0,0),(0,2))
    def __add__(self,x):
        return self.__addL__[self.number][x]
    def __mul__(self,x):
        return self.__mulL__[self.number][x]
    def __sub__(self,x):
        return self.__addL__[self.number][x]
    def __div__(self,x):
        return self.__mulL__[self.number][x]
    def __repr__(self):
        return str(self.number)

a = numpy.array([GF4(numpy.random.randint(4)) for i in range(18)]).reshape(3,6)
b = numpy.array([GF4(numpy.random.randint(4)) for i in range(18)]).reshape(3,6)

""""
In [261]: a
Out[261]: 
array([[1,1],[0,[1,1]],dtype=object)

In [262]: b
Out[262]: 
array([[0,0],[3,0]],dtype=object)

In [263]: a+1
Out[263]: 
array([[0,dtype=object)

In [264]: a+b
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-264-f1d53b280433> in <module>()
----> 1 a+b

<ipython-input-260-0679b73b59a4> in __add__(self,x)
      8         self.__mulL__ = ((0,2))
      9     def __add__(self,x):
---> 10         return self.__addL__[self.number][x]
     11     def __mul__(self,x):
     12         return self.__mulL__[self.number][x]

TypeError: tuple indices must be integers,not GF4
"""

但它也适用于数组和数组*整数计算.

"""
In [265]: a+b*1
Out[265]: 
array([[1,[2,dtype=object)
"""

我该如何更正以下代码?
我想用我的班级GF4.

解决方法

问题是当x是GF4对象时,Python不知道如何索引元组.你可以做这样的事来解决这个问题:
def __add__(self,x):
    if isinstance(x,GF4):
        x = x.number
    return self.__addL__[self.number][x]

还有一个潜在的问题你可能想看一下,这就解释了为什么你的第三个测试用例有效:当你向GF4添加一个int时返回的是一个int,而不是一个GF4.除非这是一个理想的行为,否则我认为__add__的代码应该更像:

def __add__(self,GF4):
        x = x.number
    return GF4(self.__addL__[self.number][x])

您可能想要考虑所有可能性并决定是否需要构建更多安全措施并抛出一些自己的错误,例如:如果你试图给GF4添加一个浮点数应该是什么回报?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读