scipy.signal.

选择转换方法#

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

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

这主要是为了在 convolvecorrelate 中使用 method='auto' 选项时被调用。它还可以用于确定许多相同 dtype/shape 的不同卷积的 method 值。此外,它支持对卷积进行计时,以根据特定的输入和/或硬件调整 method 的值。

参数:
在1array_like

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

in2array_like

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

模式str {‘full’, ‘valid’, ‘same’}, 可选

一个表示输出大小的字符串:

full

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

valid

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

same

输出的大小与 in1 相同,相对于 ‘full’ 输出居中。

测量bool, 可选

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

返回:
方法str

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

时间dict, 可选

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

注释

通常,这种方法对于随机选择的输入大小的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 Intel i7处理器)。

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

Added in version 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 一起工作。