我相信我正在寻找一个运算符来改变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)
答案 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)