为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复 numpy.around() 中的 -0 问题

如何修复 numpy.around() 中的 -0 问题

白猪掌柜的 2022-01-18 15:36:15
我正在 Python 上实现快速傅里叶变换 (FFT) 算法,并且由于涉及复杂的数字操作(或者可能只是由于计算机处理浮点数的固有困难),很多时候我与预期的偏差很小价值。我不得不使用numpy.around将计算结果四舍五入到可接受的精度(小数点后 10 位)。因此,我有时会得到诸如 -0+0j 之类的数字。从表面上看,这似乎不是一个大问题,但随后的计算涉及找到复数的参数(对于相位谱)。因此,我得到了错误的值,因为符号在计算中起着巨大的作用。有什么办法可以将这些 -0 结果转换为 0?下面给出了一些代码。这里的重点是函数中的return语句fft(f)。...def fft(f):    Ni = len(f)    Mi = int(Ni / 2)    if Mi <= 2:       return [f[0] + f[1] + f[2] + f[3],                f[0] - 1j*f[1] - f[2] + 1j*f[3],               f[0] - f[1] + f[2] - f[3],               f[0] + 1j*f[1] - f[2] - 1j*f[3]]    wn = math.cos(2*math.pi/Ni) - 1j*math.sin(2*math.pi/Ni)    fe = [f[i] for i in range(Ni) if i % 2 == 0]    fo = [f[i] for i in range(Ni) if i % 2 == 1]    Fe = fft(fe)    Fo = fft(fo)    return [np.around(Fe[i] + (wn**i)*Fo[i], decimals=10) for i in range(Mi)] + [np.around(Fe[i] - (wn**i)*Fo[i], decimals=10) for i in range(Mi)]x = [np.around(signal(n*tp/N), decimals=10) for n in range(N)] # input sequence_X = fft(x) # discrete Fourier transformX = [Xi/N for Xi in _X] # frequency spectrumX_amp = [np.absolute(Xi) for Xi in X] # amplitude spectrumX_phase = [np.angle(Xi) for Xi in X] # phase spectrum
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

没有一种通用的方法可以避免这种情况——负零确实只是使用浮点数的现实。

如果您希望在负零的情况下复杂参数为零,那么您可以执行以下操作将其替换为“正”零:

X_phase = [np.angle(Xi if Xi else 0+0j) for Xi in X] # phase spectrum

这将用具有“正”实部和虚部的值替换所有零值,无论符号如何。


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信