我有一些使用numpy.fft包的python代码,这里有一个片段:
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
包的结果不同。见附图。
答案 0 :(得分:2)
解决。对于我正在使用的初始化
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
添加到问题的代码中?