NumPy 中的累积交叉 addition/multiplication

Cumulative cross addition/multiplication in NumPy

a = [1,2,3]
b = [2,4,6]

c = [1*2, 1*4 + 2*2, 1*6 + 2*4 + 3*2]

我已经通过创建 Toeplitz 矩阵来使用点积,但我正在寻找一个更快的版本,因为我正在处理一个巨大的数据集。使用循环也会减慢计算速度。

此输出是 ab:

卷积的前半部分
numpy.convolve(a, b)[:len(a)]

如果您的数组足够大,您可以使用 FFT-based 卷积来节省时间:

scipy.signal.fftconvolve(a, b)[:len(a)]

FFT 卷积的运行时间为 O(n log n),其中 n 是输入数组的长度,与直接 nested-loop 卷积的 O(n^2) 运行时间形成对比。但是,它有一个较差的常数因子,并且需要floating-point运算,因此结果可能会有少量数值误差。

在足够新的 SciPy 版本上(至少 0.19.0,released March 09, 2017), you can use scipy.signal.convolve 可以根据对哪个更快的估计在直接卷积或 FFT 卷积之间自动选择。在 0.19 之前.0, scipy.signal.convolve 将始终使用直接计算。