【问题标题】:Replacing numpy.fft routines with pyfftw, not working as expected用 pyfftw 替换 numpy.fft 例程,没有按预期工作
【发布时间】:2013-09-04 14:14:13
【问题描述】:

我有一些使用 numpy.fft 包的工作 python 代码,这里是一个 sn-p:

for i in range(steps):
    print i
    psixvec = Ux * psixvec
    psikvec = Uk * np.fft.fftn(psixvec)
    psixvec = np.fft.ifftn(psikvec)

return psixvec

我尝试重写此代码以使用 pyfftw 包。我想出的是以下代码,应该工作:

fft = fftw.builders.fftn(psix_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False)

ifft = fftw.builders.ifftn(psik_align, auto_align_input = True, auto_contiguous = True,
                      overwrite_input = False, threads = 1, avoid_copy = False) 


for i in range(steps):
    psix_align[:] = Ux * psix_align
    psik_align[:] = Uk * fft()
    psix_align[:] = ifft()

return psix_align

问题是,此代码不会产生与使用 numpy.fft 包相同的结果。请参阅所附图片。

【问题讨论】:

  • 哪个图像是哪个计算的结果?
  • 第一张图片是numpy,第二张是pyfftw。

标签: python numpy fft fftw pyfftw


【解决方案1】:

解决了。对于我正在使用的初始化

psix_align = fftw.n_byte_align(psi0, fftw.simd_alignment, dtype='complex64')
psik_align = fftw.n_byte_align(np.zeros_like(psi0), fftw.simd_alignment, dtype='complex64')

我需要将complex64 替换为complex128。现在我得到了同样的结果。这可能是因为涉及的数字非常小(参见 z 轴上的 1e-11)。

编辑:也许有人可以将pyfftw 添加到问题的标签中?

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2012-04-28
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多