【问题标题】:Autocorrelation of vector in numpynumpy中向量的自相关
【发布时间】:2021-05-26 17:19:56
【问题描述】:

我不确定自相关是否是正确使用的术语,但我想要一种快速的方法,对于 numpy 数组 c,以数组 a 的形式计算平均值

a[n] = ,其中 k 遍历整个数组,取所有这些起点的平均值(可能我的符号有点偏离,但我希望这是有道理的)。

例如,我希望它为数组 c = [1,2,3,4] 返回以下内容

a = [numpy.mean([1x1, 2x2, 3x3, 4x4]), numpy.mean([1x2, 2x3, 3x4]), np.mean([1x3, 2x4]), np.mean([ 1x4])]

有没有办法使用内置的 python 函数来计算这样的平均值?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    作为第一个解决方案,您可以使用列表推导(即 for 循环):

    import numpy as np
    
    n = 4
    a = np.arange(1, n+1, dtype=float)
    
    r = np.array([np.mean(a[:n-i] * a[i:]) for i in range(n)])
    r
    array([7.5, 6.66666667, 5.5, 4.0])
    

    更进一步,我认为 here 中的“技巧”稍作修正应该会奏效:

    def autocorr(x):
        
        n = x.size
        result = np.correlate(x, x, mode='full')
       
        return result[result.size//2:]/np.arange(n, 0, -1)
    
    autocorr(a)
    array([7.5, 6.66666667, 5.5, 4.0])
    

    比较时间表现:

    n = 10_000
    a = np.arange(1, n+1, dtype=float)
    
    %timeit np.array([np.mean(a[:n-i] * a[i:]) for i in range(n)])
    104 ms ± 6.17 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit autocorr(a)
    16.5 ms ± 709 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    因此,第二种方法在 10000 的数组大小上快约 6 倍。

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 1970-01-01
      • 2015-05-23
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 2017-09-11
      相关资源
      最近更新 更多