choose_conv_method#
- scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[源代码]#
查找最快的卷积/相关方法。
此方法主要用于在
convolve
和correlate
中method='auto'
选项调用。它也可用于确定相同 dtype/形状的多个不同卷积的method
值。此外,它还支持对卷积进行计时,以使method
值适应特定的输入集和/或硬件。- 参数:
- in1类数组
传递给卷积函数的第一个参数。
- in2类数组
传递给卷积函数的第二个参数。
- modestr {‘full’, ‘valid’, ‘same’}, 可选
一个字符串,指示输出的大小
full
输出是输入的完整离散线性卷积。(默认)
valid
输出仅包含不依赖于零填充的元素。
same
输出的大小与 in1 相同,相对于“full”输出居中。
- measurebool,可选
如果为 True,则运行并计时使用两种方法对 in1 和 in2 进行卷积的结果,并返回最快的方法。如果为 False(默认),则使用预先计算的值预测最快的方法。
- 返回:
- methodstr
一个字符串,指示哪种卷积方法最快,为“direct”或“fft”
- timesdict,可选
一个字典,包含每种方法所需的时间(以秒为单位)。仅当
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 机器的。但是,我们发现此函数在硬件上具有相当不错的通用性。速度测试的质量与在机器上执行的相同测试(用于调整此函数的数字,一台配备 16GB RAM 和 2.5GHz Intel i7 处理器的 2014 年中期的 15 英寸 MacBook Pro)的质量相似(甚至略好)。
在某些情况下,
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)