You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:15:04