scipy.signal.choose_conv_method¶
- scipy.signal.choose_conv_method(in1, in2, mode='full', measure=False)[源代码]¶
找出最快的卷积/相关方法。
它的存在主要是为了在
method='auto'
选项输入convolve
和correlate
。它还可用于确定method
用于相同数据类型/形状的许多不同卷积。此外,它还支持对卷积进行计时,以适应method
到特定的一组输入和/或硬件。- 参数
- in1array_like
传入卷积函数的第一个参数。
- in2array_like
传递给卷积函数的第二个参数。
- modestr{‘完整’,‘有效’,‘相同’},可选
指示输出大小的字符串:
full
输出是输入的全离散线性卷积。(默认)
valid
输出只包含那些不依赖于补零的元素。
same
输出的大小与 in1 ,相对于“完整”输出居中。
- measure布尔值,可选
如果为True,则运行并计时 in1 和 in2 使用这两种方法,返回速度最快。如果为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)