python - 如何解决 numpy.around() 中的 -0 问题

标签 python numpy

我正在Python上实现快速傅立叶变换(FFT)算法,由于涉及复杂的数字操作(或者可能只是由于计算机处理 float 的固有困难),很多时候我会得到微小的偏差从预期值。

我必须使用 numpy.around 将计算结果舍入到可接受的精度(10 位小数)。因此,我有时会得到诸如 -0+0j 之类的数字。从表面上看,这似乎不是一个大问题,但随后的计算涉及找到复数的参数(对于相位谱)。因此,我得到了错误的值,因为符号在计算中起着巨大的作用。

有什么方法可以将这些 -0 结果转换为 0 吗?下面给出了一些代码。这里的重点是fft(f)函数中的return语句。

...
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 transform
X = [Xi/N for Xi in _X] # frequency spectrum
X_amp = [np.absolute(Xi) for Xi in X] # amplitude spectrum
X_phase = [np.angle(Xi) for Xi in X] # phase spectrum

最佳答案

没有通用的方法可以避免这种情况——负零确实是处理 float 的现实情况。

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

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

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

关于python - 如何解决 numpy.around() 中的 -0 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55788320/

相关文章:

python - 如何使用 matplotlib 在极坐标图中绘制曲线/圆弧?

python - 重命名 pylons Controller

python - SELECT COUNT(distinct CASE WHEN x > y THEN seller_id ELSE NULL END) FROM 表 GROUP BY 列 PANDAS 等效项

python - 数据转换

python - 如何将 3D 物体表面展平为 2D 阵列?

python - basemap 和密度图

python - 从字典格式化替换

python - 使用条件条件与 pandas 一起执行 numpy where

python - 如何创建以列作为数组的 pandas 数据框

python - 统一洗牌 5 GB 的 numpy 数据