【问题标题】:There is a better way to create a rolling expading mean average function with numpy? [Python]有没有更好的方法来使用 numpy 创建滚动扩展平均函数? [Python]
【发布时间】:2021-03-20 00:15:22
【问题描述】:

最近我做了一个函数来执行滚动扩展平均(不确定它是否是最好的术语)。换句话说,我想创建一个向量,它是另一个向量的元素的顺序平均值。比如取向量a = [1,2,2] ,这个变换的结果向量就是 b = [1,1.5,1.67]

我想知道在 Numpy 中是否有更好的方法(无循环)。

这是我构建的函数:

def rolling_mean():
    results = []
    for n in range(1,len(X[:])+1):
        results.append(np.expand_dims(np.mean(X[:n],axis = 2),-1))
    return np.concatenate(results,axis = 2).shape

input:
array([107.82898848, 104.20672962, 101.11936848,  95.5392514 ,
        99.25907138,  88.30364673,  95.78052502,  91.88777602,
        92.94404695,  91.43067756,  97.80829905,  88.04812676,
        86.30507539,  84.34146879,  88.78491822,  83.77489231,
        82.72204444,  78.90779523,  78.73974639,  80.6807543 ,
        76.1253219 ,  80.17892777,  83.44848362,  85.16977125,
        88.63965418,  85.36051447,  84.49254174,  80.36832368,
        78.98803082,  80.7274235 ,  77.71078257,  75.89548114,
        73.07546659,  69.81760824,  67.27589733,  66.95237855,
        63.12044925,  63.58189569,  68.6789082 ,  70.92299637,
        69.96511396,  66.70713942,  64.04006182,  69.28454443,
        69.16610418,  66.76003564,  67.10493197,  74.06540923,
        74.19043057,  76.14746791])

output:

array([107.82898848, 106.01785905, 104.38502886, 102.17358449,
       101.59068187,  99.37617601,  98.86251159,  97.99066964,
        97.42993379,  96.83000816,  96.9189437 ,  96.17970895,
        95.42012176,  94.6287894 ,  94.23919799,  93.58517888,
        92.94617098,  92.16626121,  91.45960254,  90.92066013,
        90.21612021,  89.75988419,  89.48547547,  89.30565446,
        89.27901445,  89.12830291,  88.95660805,  88.64988361,
        88.31671627,  88.06373985,  87.72977348,  87.35995185,
        86.92708866,  86.42386865,  85.87678375,  85.35110583,
        84.75027727,  84.1932146 ,  83.79541187,  83.47360148,
        83.14412618,  82.75276935,  82.31759011,  82.02138452,
        81.73571163,  81.41015345,  81.10578704,  80.9591125 ,
        80.82097613,  80.72750597])

【问题讨论】:

    标签: python arrays numpy average moving-average


    【解决方案1】:

    试试这样的:

    >>> a.cumsum() / np.arange(1, len(a) + 1)
    array([1.        , 1.5       , 1.66666667])
    

    只检查较大的:

    >>> a = np.array([107.82898848, 104.20672962, 101.11936848,  95.5392514 ,
            99.25907138,  88.30364673,  95.78052502,  91.88777602,
            92.94404695,  91.43067756,  97.80829905,  88.04812676,
            86.30507539,  84.34146879,  88.78491822,  83.77489231,
            82.72204444,  78.90779523,  78.73974639,  80.6807543 ,
            76.1253219 ,  80.17892777,  83.44848362,  85.16977125,
            88.63965418,  85.36051447,  84.49254174,  80.36832368,
            78.98803082,  80.7274235 ,  77.71078257,  75.89548114,
            73.07546659,  69.81760824,  67.27589733,  66.95237855,
            63.12044925,  63.58189569,  68.6789082 ,  70.92299637,
            69.96511396,  66.70713942,  64.04006182,  69.28454443,
            69.16610418,  66.76003564,  67.10493197,  74.06540923,
            74.19043057,  76.14746791])
    
    >>> a.cumsum() / np.arange(1, len(a) + 1)
    array([107.82898848, 106.01785905, 104.38502886, 102.1735845 ,
           101.59068187,  99.37617601,  98.86251159,  97.99066964,
            97.42993379,  96.83000816,  96.9189437 ,  96.17970895,
            95.42012176,  94.6287894 ,  94.23919799,  93.58517889,
            92.94617098,  92.16626121,  91.45960254,  90.92066013,
            90.21612021,  89.75988419,  89.48547547,  89.30565446,
            89.27901445,  89.12830291,  88.95660805,  88.64988361,
            88.31671627,  88.06373985,  87.72977348,  87.35995185,
            86.92708866,  86.42386865,  85.87678375,  85.35110583,
            84.75027727,  84.1932146 ,  83.79541187,  83.47360148,
            83.14412618,  82.75276935,  82.31759011,  82.02138452,
            81.73571163,  81.41015345,  81.10578704,  80.9591125 ,
            80.82097613,  80.72750597])
    

    【讨论】:

    • @Nick 我知道那种感觉,兄弟
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2013-12-03
    • 2011-04-13
    • 2022-09-25
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多