如何在numpy中更新点积?

时间:2018-08-26 11:03:05

标签: python numpy

我不知道如何更新点积。
更具体地说,我有一个在totv = np.dot(x, values)函数的__init__中定义的类,其中xvalues是两个NumPy数组。
然后使用以下方法之一,更改数组x中的一个值。
如何在以后的方法中自动更新点积totv

2 个答案:

答案 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.xself.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每次被引用时都会计算