【问题标题】:Vectorization for computing variance of a vector split at different points用于计算向量在不同点拆分的方差的向量化
【发布时间】:2021-11-03 16:03:44
【问题描述】:

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

【问题讨论】:

  • 所以你只想*扩大方差?
  • @ddejohn 相当扩展
  • 正确,谢谢 Moz。

标签: python numpy vectorization


【解决方案1】:

是的,因为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

【讨论】:

  • 什么是变量s,你的意思是cumsum
  • @Brenlla 是的,我粗心的重构。
【解决方案2】:

对于 pandas,您可以使用 expanding:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多