这是我的代码
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
我用(a^2+b^2)^0.5
确认了np.abs
,那么对于实数数组,abs和实数结果怎么会不同呢?差异如此之大,不容忽视。我将arr2D_x0
的数据类型更改为np.float64
和np.float96
,但结果没有任何变化。
对于实数数组,abs和实数结果如何不同?
因为他们做不同的事情np.abs
按元素计算绝对值,而np.real
按元素返回复变元的实部。
为了更好地理解它们不同的原因,让我们假设arr2D_x0 = np.real(np.fft.ifft2(arr2D_g, norm='ortho'))
是一个简单的数组,就像arr2D_x0 = np.array([-1.2, 1.2])
一样
计算实数数组的实数部分对它没有任何作用;另一方面,计算绝对值会将负值转化为正值。所以这基本上就是你正在做的事情和不同结果的原因。
x = np.real(arr2D_x0) # array([-1.2, 1.2])
np.sum(x) # 0.0
y = np.abs(arr2D_x0) # array([1.2, 1.2])
np.sum(y) # 2.4