#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()