作为第一个解决方案,您可以使用列表推导(即 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 倍。