自定义类 - 更改数组中的属性

时间:2015-05-26 16:43:51

标签: python arrays class numpy operator-keyword

我相信我正在寻找一个运算符来改变Python的数组。我已经为numpy数组矩阵创建了一个自定义类。

我想更改数组中的单个元素,这也会更改零的数量,这就是下面的类。

class MyClass(object):
def __init__(self, Matrix):
      self._nonzero=len(Matrix[nonzero(Matrix)])
      self._Matrix=Matrix
def set_Matrix(self,Matrix):
    self._Matrix=Matrix
    self._nonzero=len(Matrix[nonzero(Matrix)])
def get_Matrix(self):
    return self._Matrix
def get_nonzero(self):
    return self._nonzero    

Matrix=property(fget=get_Matrix,fset=set_Matrix)         
nonzero =property(fget=get_nonzero,fset=set_Matrix)

如果我有以下输入,我会得到以下结果

a= array([[1, 2],
         [3, 4]]) 
g=MyClass(a)
g.nonzero
>>>4 #Correct
g.Matrix=array([[0, 2],
                [3, 4]])
g.nonzero
>>>3 #Correct

但我想以更简单的方式更改numpy数组矩阵中的单个元素。当我尝试以下操作时,我弄错了:

g.Matrix[0,0]=0
g.Matrix
>>>array([[0, 2],
          [3, 4]])
g.nonzero
>>>4 #incorrect

修改

我相信我用这段代码解决了它。我不确定它是否已经过优化,但确实有效。

class MyClass(object):
   def __init__(self, Matrix):
      self._Matrix=Matrix
   def set_Matrix(self,Matrix):
      self._Matrix=Matrix
   def get_Matrix(self):
      return self._Matrix
   def set_nonzero(self,Matrix):
       self._Matrix=Matrix
       self._nonzero=len(Matrix[nonzero(Matrix)])
   def get_nonzero(self):
      self._Matrix=Matrix
      self._nonzero=len(Matrix[nonzero(Matrix)])
      return self._nonzero

   Matrix=property(fget=get_Matrix,fset=set_Matrix)         
   nonzero =property(fget=get_nonzero,fset=set_nonzero)

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,只有在首次实例化对象时才会计算非零值。最好的选择是使非零评估而不是返回存储的值。

class MyClass(object):
   def __init__(self, Matrix):
      self._Matrix=Matrix
   def set_Matrix(self,Matrix):
      self._Matrix=Matrix
   def get_Matrix(self):
      return self._Matrix
   def get_nonzero(self):
      return len(_Matrix[nonzero(_Matrix)])

或者如果你想要非零缓存,你可以隐藏类的用户矩阵,并重载索引操作符,例如。

class MyClass(object):
   def __init__(self, Matrix):
      self.__Matrix=Matrix
      self._nonzero=len(__Matrix[nonzero(__Matrix)])
   def get_nonzero(self):
      return len(__Matrix[nonzero(Matrix)])
   def __getitem__(self,index):
      return self.__Matrix[index]
   def __setitem__(self, index, value)
      self.__Matrix[index] = value
      self._nonzero = len(__Matrix[nonzero(__Matrix)])
   def get_nonzero(self):
      return self._nonzero  

要么包括:

Matrix=property(fget=get_Matrix,fset=set_Matrix)         
nonzero =property(fget=get_nonzero,fset=set_nonzero)