scipy.fft.rfftn
が実数値のn次元フーリエ変換 (FFT)、scipy.fft.irfftn
はその逆変換なので、普通
irfftn(rfftn(a)) == a
を浮動小数点数の精度の範囲内で期待するけど、aの大きさが奇数の時そうはならない。
import numpy as np
from scipy.fft import rfft2, irfft2
a = np.eye(5) # 5 x 5
irfft2(rfft2(a)).shape # => (5, 4)
rfft2(a)
は複素数の shape=(5,3) になるけど、これが shape=(5, 5) の実数から来たという情報が失われているので元の大きさを irfftn に渡さないといけない:
a = np.eye(5) # 5 x 5
aa = irfft2(rfft2(a), a.shape) # => a == aa
これで期待通り a == aa
になる(もちろん浮動小数点数の範囲内で)