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 矩阵来使用点积,但我正在寻找一个更快的版本,因为我正在处理一个巨大的数据集。使用循环也会减慢计算速度。
此输出是 a
和 b
:
卷积的前半部分
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
将始终使用直接计算。
a = [1,2,3]
b = [2,4,6]
c = [1*2, 1*4 + 2*2, 1*6 + 2*4 + 3*2]
我已经通过创建 Toeplitz 矩阵来使用点积,但我正在寻找一个更快的版本,因为我正在处理一个巨大的数据集。使用循环也会减慢计算速度。
此输出是 a
和 b
:
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
将始终使用直接计算。