scipy 使用pyFFTW卷积两个PDF

zdwk9cvp  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(120)

我想得到两个随机变量之和的众数和标准差。为此,我创建了PDF的离散表示,并执行卷积以获得新的PDF,从中计算模式和标准差。
我使用的是scipy.signal.fftconvolve,但由于操作执行了大约40万次,这需要花费大量时间。
我想使用pyFFTW库来加快速度,但无法使其工作。据我所知,我需要:
1.计算两个PDF上的FFT。
1.将FFT相乘。
1.计算FFT相乘的IFFT。
雪上加霜的是,这两个分布都不是以零为中心的,也不是对称的。
两个PDF的样本和当前卷积的代码可以在这里看到:https://gist.github.com/ajossorioarana/047202db9c2990b43cf7ba2e02735faf
关键部分是最后一个:

# Do the convolution with scipy.signal.fftconvolve
convolution_pdf = scipy.signal.fftconvolve(pdf1, pdf2, 'full')
convolution_pdf = convolution_pdf[0:len(pdf1)]

我试着用下面的代码替换上面的代码:

## Do the convovlution with pyfftw.builders
builder1 = pyfftw.builders.fft(pdf1)
builder2 = pyfftw.builders.fft(pdf2)

fft1 = builder1()
fft2 = builder2()

builder3 = pyfftw.builders.ifft(fft1*fft2)

convolution = builder3()
ijnw1ujt

ijnw1ujt1#

为了提高速度,你可以修补scipy.signal.fftconvolve以使用pyFFTW接口:

from timeit import Timer

import numpy
import pyfftw
import scipy.signal

# Planning first and enabling cache for optimization
shape = (1024, 512)
a = pyfftw.empty_aligned(shape, dtype="complex128")
b = pyfftw.empty_aligned(shape, dtype="complex128")
pyfftw.interfaces.cache.enable()

a[:] = numpy.random.randn(*shape) + 1j * numpy.random.randn(*shape)
b[:] = numpy.random.randn(*shape) + 1j * numpy.random.randn(*shape)

t = Timer(lambda: scipy.signal.fftconvolve(a, b))
print(f"Vanilla: {t.timeit(number=100):1.3f} seconds")

# Patching `fftpack` with `pyfftw.interfaces.scipy_fftpack`
scipy.fftpack = pyfftw.interfaces.scipy_fftpack
scipy.signal.fftconvolve(a, b)

print(f"Patched: {t.timeit(number=100):1.3f} seconds")

但是我没有得到明显的改善。
pyFFTW在处理大量数据数组时有可能提高性能。然而,当涉及到在精简数据库上顺序迭代特定数量的操作时,改进被证明是相当小的。

相关问题