scipy.signal.choose_conv_method

scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[源代码]

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

它的存在主要是为了在 method='auto' 选项输入 convolvecorrelate 。它还可用于确定 method 用于相同数据类型/形状的许多不同卷积。此外,它还支持对卷积进行计时,以适应 method 到特定的一组输入和/或硬件。

参数
in1array_like

传入卷积函数的第一个参数。

in2array_like

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

modestr{‘完整’,‘有效’,‘相同’},可选

指示输出大小的字符串:

full

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

valid

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

same

输出的大小与 in1 ,相对于“完整”输出居中。

measure布尔值,可选

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

退货
method应力

一个字符串,指示哪种卷积方法最快,可以是“直接”或“FFT”

timesDICT,可选

包含每种方法所需时间(以秒为单位)的字典。只有在以下情况下才返回此值 measure=True

注意事项

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

为了测试这个功能,我们在AmazonEC2r5a.2xLarge机器上运行了实验。这些实验测量了在使用时所需时间的比率 method='auto' 以及最快方法所需的时间(即, ratio = time_auto / min(time_fft, time_direct) )。在这些实验中,我们发现:

  • 对于1D信号,该比率小于1.5的可能性为95%,对于2D信号,该比率小于2.5的可能性为99%。

  • 对于1D/2D信号,这一比值始终小于2.5/5。

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

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

以上所有数字都特定于EC2机器。但是,我们确实发现该函数在硬件上具有相当好的通用性。速度测试的质量与在这台机器上进行的调整这一功能的相同测试(2014年年中的15英寸MacBook Pro,内存为16 GB,英特尔i7处理器为2.5 GHz)相似(甚至略好)。

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

0.19 新版功能.

示例

估计给定输入的最快方法:

>>> 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'

然后可以将其应用于相同数据类型和形状的其他数组:

>>> 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