用于计算不同点处向量分割的方差的向量化

Bre*_*lla 3 python numpy vectorization

我有一个一维数组arr,我需要计算从位置 0 开始的所有可能的连续子向量的方差。使用 for 循环可能更容易理解:

np.random.seed(1)
arr = np.random.normal(size=100)

res = []   
for i in range(1, arr.size+1):
    subvector = arr[:i]
    var = np.var(subvector)
    res.append(var)
Run Code Online (Sandbox Code Playgroud)

有没有办法res不用for循环来计算?

Qua*_*ang 5

是的,由于var = sum_squares / N - mean**2、 和mean = sum /N,您可以执行以下操作cumsum来获得累计总和:

cumsum = np.cumsum(arr)
cummean = cumsum/(np.arange(len(arr)) + 1)
sq = np.cumsum(arr**2)

# correct the dof here
cumvar = sq/(np.arange(len(arr))+1) - cummean**2

np.allclose(res, cumvar)
# True
Run Code Online (Sandbox Code Playgroud)