选择转换方法#
- scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[源代码][源代码]#
找到最快的卷积/相关方法。
这主要是为了在
convolve
和correlate
中使用method='auto'
选项时被调用。它还可以用于确定许多相同 dtype/shape 的不同卷积的method
值。此外,它支持对卷积进行计时,以根据特定的输入和/或硬件调整method
的值。- 参数:
- 在1array_like
传递给卷积函数的第一个参数。
- in2array_like
传递给卷积函数的第二个参数。
- 模式str {‘full’, ‘valid’, ‘same’}, 可选
一个表示输出大小的字符串:
full
输出是输入的完整离散线性卷积。(默认)
valid
输出仅包含那些不依赖于零填充的元素。
same
输出的大小与 in1 相同,相对于 ‘full’ 输出居中。
- 测量bool, 可选
如果为 True,则运行并计时 in1 和 in2 的卷积,使用两种方法并返回最快的方法。如果为 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)