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

Custom Class - Change attribute in array

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

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

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)

您遇到的问题是非零值仅在您的对象首次实例化时计算。最好的选择是使非零评估而不是 return 存储的值。

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 的用户隐藏矩阵并重载索引运算符以获取它,例如

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)