调用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
相关产品推荐
相关产品推荐

