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

调用np.sum(np.abs(X))与np.sum(np.real(X))得不同结果的疑问

问题分析与解答

你的代码

import numpy as np

arr2D_x0 = np.real(np.fft.ifft2(arr2D_g, norm='ortho'))
print('arr2D_x0',np.sum(np.abs(arr2D_x0)), np.sum(np.real(arr2D_x0)), np.sum(arr2D_x0), np.unique(np.imag(arr2D_x0)))
print((np.abs(arr2D_x0) == np.real(arr2D_x0)).all(), (arr2D_x0 == np.real(arr2D_x0)).all(), (np.abs(arr2D_x0) == arr2D_x0).all())

输出结果

arr2D_x0 16241240.101077307 13039017.97206586 13039017.97206586 [0.]
False True False

核心原因

从输出的布尔判断结果可以直接定位问题:

  • (arr2D_x0 == np.real(arr2D_x0)).all() 为True,结合虚部全0的结果,说明arr2D_x0确实是纯实数数组,不存在精度导致的虚部干扰。
  • (np.abs(arr2D_x0) == arr2D_x0).all() 为False,这直接说明数组中存在负数值。

两个求和的本质差异:

  • np.sum(np.abs(arr2D_x0)):对所有元素取绝对值(负数转为正数)后求和,得到的是所有元素的总幅值,不会有正负抵消。
  • np.sum(arr2D_x0):直接对数组元素求和,负数会抵消掉一部分正数的和,因此结果远小于绝对值求和。

举个简单例子验证:数组[5, -3],绝对值求和为5+3=8,直接求和为5-3=2,差异逻辑完全匹配你的情况。

你修改数据类型无变化的原因是,问题根本不是浮点精度问题,而是数组本身包含负数,和数据类型无关。

内容的提问来源于stack exchange,提问作者Yan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:15:07