我不知道如何更新点积。
更具体地说,我有一个在totv = np.dot(x, values)
函数的__init__
中定义的类,其中x
和values
是两个NumPy数组。
然后使用以下方法之一,更改数组x
中的一个值。
如何在以后的方法中自动更新点积totv
?
答案 0 :(得分:1)
所以我假设您遇到以下情况:
import numpy as np
class my_class():
def __init__(self, x, values):
self.x = x
self.values = values
self.totv = np.dot(x, values)
def update_x(self, i, v):
self.x[i] = v
inst = my_class(np.array([1,2,3]), np.array([4,5,6]))
inst.update_x(1, 4)
print(inst.__dict__)
给出:
{'x': array([1, 4, 3]), 'values': array([4, 5, 6]), 'totv': 32}
因为:
>>> 1 * 4 + 2 * 5 + 3 * 6
32
因此,您希望在x
方法中修改update_x
属性时,会重新评估self.totv
。
恐怕每次您修改self.totv = ...
时,它们都不能替代调用:self.x
。但是,可以通过定义一种更新totv
属性的方法来提高代码的可读性:
class my_class():
def update_totv(self):
self.totv = np.dot(self.x, self.values)
def __init__(self, x, values):
self.x = x
self.values = values
self.totv = np.dot(x, values)
def update_x(self, i, v):
self.x[i] = v
self.update_totv()
现在,只要您在每次修改self.update_totv()
之后调用self.x
,self.totv
就会相应地更新。因此,使用此新类声明的第一个代码将给出正确的输出:
{'x': array([1, 4, 3]), 'values': array([4, 5, 6]), 'totv': 42}
因为:
>>> 1 * 4 + 4 * 5 + 3 * 6
42
答案 1 :(得分:0)
您实际上是否想要totv的属性定义?
>>> import numpy as np
>>> class Tot:
... def __init__(self,x,values):
... self.x = x
... self.values = values
... @property
... def totv(self):
... return np.dot(self.x,self.values)
...
>>> tot = Tot(np.array([1,2,3]),np.array([1,0,1]))
>>> tot.totv
4
>>> tot.x = np.array([14,14,19])
>>> tot.totv
33
>>>
这里tot.totv
每次被引用时都会计算