如何提高 Python DataFrame 中小数点的精度?

问题描述 投票:0回答:1

我正在用 Python 开发一个系统,它复制了用 LabWindows 编写的另一个系统。设计的一部分涉及计算周期图,它返回一个十进制数组。然后我将此数组添加到 DataFrame 中以进行进一步计算。然而,在此过程中,小数精度被截断为 7 或 9 位,导致精度损失。

问题:

我需要保证至少15位小数的精度。为了确认该问题,我执行了以下步骤:

  1. 产生正弦波。
  2. 计算周期图。
  3. 比较 LabWindows 和 Python 之间的结果。

观察:

  • 当Python保持高精度时,结果具有可比性。
  • 输出之间的比例一致:1:8 :: LabWindows:Python
  • 当Python的精度限制为7位时,超过60点的结果数组值会偏离这个恒定比率,从而引入噪声。

问题:

如何确保Python在整个过程中保持较高的精度(至少15位小数)?

Python代码:

import numpy as np
from scipy.signal import periodogram

N = 256  # Number of samples
t = np.arange(N)  # Time array
signal = (np.sin(2 * np.pi * 0.05 * t) + 
          np.sin(2 * np.pi * 0.1 * t) + 
          np.sin(2 * np.pi * 0.25 * t))
fs = 1.0  # Sampling frequency

frequencies, spectrum = periodogram(signal, fs=fs, window='hann', scaling='spectrum')
np.savetxt('py_spectrum.txt', spectrum, header='spectrum Data')

LabWindows 代码(C):

#define N 256 
double t[N], signal[N];
for (int i = 0; i < N; i++) 
{
    t[i] = i;  // Discrete time index
    signal[i] = sin(2 * 3.141592 * 0.05 * t[i]) +
                sin(2 * 3.141592 * 0.1 * t[i]) +
                sin(2 * 3.141592 * 0.25 * t[i]);
}

// Apply Hann Window and calculate Spectrum
HanWin(signal, N);
Spectrum(signal, N);
}
python dataframe decimal signal-processing precision
1个回答
0
投票

为了在使用周期图时保持更高的精度,请考虑更改以下内容:

  1. 计算精度高

使用

float64
,它提供15-16位小数。

import numpy as np

signal = np.array(signal, dtype=np.float64)
// you can also use float128 if supported
  1. 使用
    decimal
    模块

如果需要任意精度,则使用十进制模块:

from decimal import Decimal, getcontext

# Set precision to 15 decimal places
getcontext().prec = 15

# Convert the signal array to Decimal
signal = [Decimal(s) for s in signal]
  1. 还配置 Pandas 显示更多小数值
import pandas as pd
pd.set_option('display.float_format', '{:.15f}'.format)

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.