如何用纯Python实现三维Numpy数组的逆离散傅里叶变换
三维手动IDFT实现方案
三维逆离散傅里叶变换属于可分离变换,可以通过依次对数组的三个维度各执行一次一维IDFT得到,你现有1D实现的核心逻辑可以直接复用,不需要做底层修改,完整实现代码如下:
import numpy as np # 复用你原有1D IDFT的核心实现逻辑 def IFT_1d(data): data = np.asarray(data) N = data.shape[0] n = np.arange(N) k = n.reshape((N, 1)) M = np.exp(2j * np.pi * k * n / N) return (1 / N) * np.dot(M, data) # 适配三维数组的IDFT实现 def IFT_3d(data): data = np.asarray(data) # 输入合法性校验 assert len(data.shape) == 3, "仅支持三维数组输入" # 依次对三个维度执行一维IDFT,变换顺序不影响最终结果 res = np.apply_along_axis(IFT_1d, axis=0, arr=data) res = np.apply_along_axis(IFT_1d, axis=1, arr=res) res = np.apply_along_axis(IFT_1d, axis=2, arr=res) return res
效果验证代码
你可以用以下代码和numpy官方的FFT接口做结果对比,正常误差会在浮点计算精度范围内:
if __name__ == "__main__": # 随机生成复数类型三维测试数组 test_arr = np.random.randn(4,4,4) + 1j * np.random.randn(4,4,4) # 手动计算3D IDFT结果 manual_result = IFT_3d(test_arr) # 官方接口计算结果作为参考 official_result = np.fft.ifftn(test_arr) # 输出最大误差,正常为1e-10量级 print("计算结果最大误差:", np.max(np.abs(manual_result - official_result)))
注意事项
np.apply_along_axis属于numpy通用数组操作接口,不属于FFT相关内置函数,完全符合你纯手动实现的要求- 手动IDFT的时间复杂度为O(N²),如果处理大尺寸三维数组时速度较慢属于正常情况,和算法本身特性有关
- 如果你有特殊的维度计算优先级要求,只需要调整
apply_along_axis的axis参数执行顺序即可
内容的提问来源于stack exchange,提问作者Pranoy Ray
相关产品推荐
相关产品推荐

