scipy.signal.

choose_conv_method#

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

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

此函数主要用于在 convolvecorrelatemethod='auto' 选项中调用。它也可以用于确定许多不同数据类型/形状卷积的 method 值。此外,它支持对卷积进行计时,以使 method 的值适应特定的输入集和/或硬件。

参数:
in1类数组

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

in2类数组

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

mode字符串 {‘full’, ‘valid’, ‘same’},可选

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

full

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

valid

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

same

输出与 in1 大小相同,以‘full’输出为中心。

measure布尔值,可选

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

返回:
method字符串

一个字符串,指示哪种卷积方法最快,可以是‘direct’(直接)或‘fft’(快速傅里叶变换)。

times字典,可选

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

另请参阅

convolve
correlate

说明

通常,对于随机选择的输入大小,此方法对二维信号的准确率为 99%,对一维信号的准确率为 85%。为了精确,可以使用 measure=True 通过计时卷积来找到最快的方法。这可以避免以后寻找最快 method 的最小开销,或者使 method 的值适应特定的输入集。

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

  • 对于一维信号,该比率有 95% 的几率小于 1.5;对于二维信号,有 99% 的几率小于 2.5。

  • 该比率对于一维/二维信号分别始终小于 2.5/5。

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

二维结果几乎肯定可以推广到三维/四维等,因为它们的实现是相同的(一维实现不同)。

上述所有数字都特定于 EC2 机器。然而,我们确实发现此函数在不同硬件上具有相当不错的通用性。速度测试的质量与用于调整此函数参数的机器(一台 2014 年中期的 15 英寸 MacBook Pro,配备 16GB 内存和 2.5GHz Intel 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'

这可以应用于具有相同数据类型和形状的其他数组

>>> 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 配合使用。