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

Vectorization for computing variance of a vector split at different points

我有一个一维数组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)

有没有什么方法可以不用 for 循环来计算 res

是的,因为 var = sum_squares / N - mean**2mean = 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

使用 pandas,您可以使用 expanding:

import pandas as pd
pd.Series(arr).expanding().var(ddof=0).values

注意。优点之一是您可以受益于 var 参数(默认情况下 ddof=1),当然,您可以 运行 许多其他方法。