pyFFTW链接的变量多于预期

时间:2017-10-10 08:23:49

标签: python variable-assignment pyfftw

我正在使用python编写一个使用pyfftw的分步傅里叶变换方法。我想我大部分时间都在理解发生了什么,但我无法理解为什么当我尝试只运行一个时,我的变量会发生很多变化。

在下面的代码中,我从一维数组(complex128)E开始,最初将其分配给a。然后我会计划DFT,这样我就可以在时间和频率之间来回进行2次操作。

我的代码:

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的变量似乎保持链接而不是临时变量。

发生了什么事?

1 个答案:

答案 0 :(得分:0)

Ea(通过E is a查看)。这是因为FFTW对象的第二个参数是输出数组,这是执行ifft_object()时返回的内容。

然后您将A0指定为E,所以当您更改a时,您也会更改A0,因为它们是同一个对象。

如果使用FFTW对象,则需要注意这些事情。它旨在最大限度地减少副本,因此您可以自行更正数组。如果您不想这样做,我建议使用pyfftw.builders界面。