2017-10-10 312 views
0

我正在使用python编写使用pyfftw的分步傅里叶变换方法。我想我主要了解发生了什么,但我不明白为什么当我尝试以一种方式操作时,我的许多变量会发生变化。pyFFTW链接更多变量比预期

在下面的代码中,我从一维数组(complex128),E开始,最初将其分配给a。然后,我计划了DFT,以便我有两次在时间和频率之间来回切换的操作。

我的代码:

a = pyfftw.empty_aligned(npts, dtype='complex128') 
b = pyfftw.empty_aligned(npts, dtype='complex128') 

a[:] = pyfftw.interfaces.numpy_fft.fftshift(E); 

fft_object = pyfftw.FFTW(a, b) 
EFT = fft_object() 

ifft_object = pyfftw.FFTW(b, a, direction='FFTW_BACKWARD') 
E = ifft_object() 

A0 = E; 
a[:] = np.power(np.absolute(A0),2) 
IFT = fft_object() 
b[:] = chi*IFT 
Iz = np.power(np.absolute(A0),2) + ifft_object() 
NLfn = A0 * Iz 

的问题是,一旦我进入代码的第二部分,分配a[:] = np.power(np.absolute(A0),2)似乎改变A0以及a

这也发生在Iz = np.power(np.absolute(A0),2) + fft_object(),其中在每种情况下我分配ab似乎保持链接,而不是临时变量的变量。

发生了什么事?

回答

0

Ea(检查做E is a)。这是因为FFTW对象的第二个参数是输出数组,这是当您执行ifft_object()时返回的结果。

然后,您将A0指定为E,因此绝对当您更改a时,也会更改A0,因为它们是相同的对象。

如果您使用FFTW对象,则需要注意这些事情。它旨在最大限度地减少副本,所以取决于数组的正确性。如果你不想这样做,我建议使用pyfftw.builders接口。