用于计算在不同点处分割的向量方差的向量化
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**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
使用 pandas,您可以使用 expanding
:
import pandas as pd
pd.Series(arr).expanding().var(ddof=0).values
注意。优点之一是您可以受益于 var
参数(默认情况下 ddof=1
),当然,您可以 运行 许多其他方法。
我有一个一维数组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**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
使用 pandas,您可以使用 expanding
:
import pandas as pd
pd.Series(arr).expanding().var(ddof=0).values
注意。优点之一是您可以受益于 var
参数(默认情况下 ddof=1
),当然,您可以 运行 许多其他方法。