scipy.signal.

choose_conv_method#

scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[source]#

找到最快的卷积/相关方法。

这主要存在于 method='auto' 选项在 convolvecorrelate 中调用时。它也可以用来确定 method 的值,用于对相同 dtype/shape 的许多不同卷积。此外,它支持对卷积进行计时,以使 method 的值适应特定的一组输入和/或硬件。

参数:
in1array_like

传递到卷积函数的第一个参数。

in2array_like

传递到卷积函数的第二个参数。

modestr {‘full’, ‘valid’, ‘same’}, optional

一个字符串,指示输出的大小

full

输出是输入的完整离散线性卷积。 (默认)

valid

输出只包含那些不依赖于零填充的元素。

same

输出与 in1 大小相同,相对于“full”输出居中。

measurebool, optional

如果为 True,则运行并计时 in1in2 的卷积,使用两种方法并返回最快的。 如果为 False (默认),则使用预先计算的值预测最快的算法。

返回值:
methodstr

一个字符串,指示哪种卷积方法最快,要么是 ‘direct’ 要么是 ‘fft’

timesdict, optional

一个字典,包含每种方法所需的时间(以秒为单位)。 该值仅在 measure=True 时返回。

另请参见

convolve
correlate

备注

通常,对于随机选择的输入大小,该方法对于 2D 信号的准确率为 99%,对于 1D 信号的准确率为 85%。 为了获得精度,使用 measure=True 通过计时卷积来找到最快的算法。 这可以用来避免稍后找到最快 method 的最小开销,或者调整 method 的值以适应特定的一组输入。

实验在 Amazon EC2 r5a.2xlarge 机器上运行,以测试此函数。 这些实验测量了使用 method='auto' 所需的时间与最快方法所需时间的比率(即 ratio = time_auto / min(time_fft, time_direct))。 在这些实验中,我们发现

  • 对于 1D 信号,此比率小于 1.5 的概率为 95%,对于 2D 信号,此比率小于 2.5 的概率为 99%。

  • 对于 1D/2D 信号,该比率始终小于 2.5/5。

  • 该函数对于使用 method='direct' 耗时 1 到 10 毫秒的 1D 卷积最为不准确。 这方面的一个很好的代理(至少在我们实验中)是 1e6 <= in1.size * in2.size <= 1e7

2D 结果几乎可以肯定地推广到 3D/4D/等等,因为实现是相同的(1D 实现不同)。

以上所有数字都是针对 EC2 机器。 然而,我们确实发现,该函数在硬件之间具有相当好的泛化性。 速度测试与在用于调整该函数数字的机器上执行的相同测试质量相似(甚至略好)(一台 2014 年中期的 15 英寸 MacBook Pro,配备 16GB RAM 和 2.5GHz 英特尔 i7 处理器)。

在某些情况下,fftconvolve 支持输入,但该函数返回 direct(例如,为了防止浮点整数精度)。

版本 0.19 中添加。

示例

估计给定输入的最快的算法

>>> import numpy as np
>>> from scipy import signal
>>> rng = np.random.default_rng()
>>> img = rng.random((32, 32))
>>> filter = rng.random((8, 8))
>>> method = signal.choose_conv_method(img, filter, mode='same')
>>> method
'fft'

然后可以将其应用于相同 dtype 和形状的其他数组

>>> img2 = rng.random((32, 32))
>>> filter2 = rng.random((8, 8))
>>> corr2 = signal.correlate(img2, filter2, mode='same', method=method)
>>> conv2 = signal.convolve(img2, filter2, mode='same', method=method)

该函数的输出 (method) 与 correlateconvolve 配合使用。