Почему pyfftw выводит ноль?

#python #pyfftw

#python #pyfftw

Вопрос:

Это, должно быть, глупый вопрос, но я сам не мог понять, что не так. Я хотел протестировать pyfftw, поэтому я запустил следующий код:

 import numpy as np
import pyfftw

a = np.random.randn(2,64,64)
b = np.zeros(2,64,33)*np.complex(0.)

pyfftw.FFTW(a,b,axes = (-2,-1), direction = 'FFTW_FORWARD')
  

Я ожидаю, что массив b будет изменен на режимы Фурье массива a . Но оказывается, что b это все еще все нули. Так что же здесь не так? Кто-нибудь может дать подсказку? Большое вам спасибо.

Вот продолжение. Спасибо AKX и Hamaza за указание на то, что я должен запустить метод execute(), чтобы выполнить БПФ. Но теперь есть еще одна проблема. Я попытался вызвать pyfftw в самостоятельно определенной функции. Вывод показывает, что входной массив изменен на все нули.

 def f2fh(f):
    ftmp = np.copy(f)
    nz,nx,ny = f.shape
    nky = ny
    nkx = (nx/2) 1
    fh = np.zeros((nz,nky,nkx))*np.complex(0.)
    print 'ksksks',ftmp.shape,fh.shape,ftmp
    pyfftw.FFTW(ftmp, fh, axes = (-2,-1), direction = 'FFTW_FORWARD').execute()
    print 'a',ftmp
    return fh
  

Вывод
введите описание изображения здесь

Может кто-нибудь подсказать, что не так на этот раз? Большое спасибо…

Ответ №1:

Ты не звонишь execute() . Через документы:

Фактический FFT или iFFT выполняется путем вызова execute() метода.

execute() : Выполните запланированную операцию, выбрав правильный тип БПФ из входного массива (т. Е. FFTW.input_array ) и поместив результат в выходной массив (т.Е. FFTW.output_array).

Возможно, вы также захотите использовать «более простые» интерфейсы, описанные здесь:

b = pyfftw.interfaces.numpy_fft.fft(a)

Комментарии:

1. Вы должны были задать следующий вопрос как отдельный вопрос, но в документации сказано: «input_array и output_array должны быть массивами numpy. Содержимое этих массивов будет уничтожено процессом планирования во время инициализации «. Если вам нужно исходное содержимое, передайте копию в FFTW.

2. Вы также можете вызвать сам объект FFTW (который execute завершается некоторыми дополнительными проверками).

Ответ №2:

Вам нужно позвонить execute() .

 pyfftw.FFTW(a,b,axes = (-2,-1), direction = 'FFTW_FORWARD').execute()