【问题标题】:Loss of precision in NetCDF data when importing into python due to scale factor and offset由于比例因子和偏移,导入 python 时 NetCDF 数据的精度损失
【发布时间】:2020-05-02 03:05:35
【问题描述】:

我有一个通过数值模拟生成的 NetCDF 文件。 数据使用比例因子和偏移量存储,ncdump 的示例如下:

    float lon(lon) ;
        lon:long_name = "longitude" ;
        lon:standard_name = "coordinates_i" ;
        lon:units = "degrees_east " ;
        lon:scale_factor = 9.308405e-06f ;
        lon:add_offset = 118.9597f ;

这些数据应该从一个值平滑地变化到另一个值。

如果我使用 netcdf4 或 xarray e'g' data = xr.open_dataset('path/to/file') 导入它,那么当我查看坐标时数据已经丢失并且它们不再平滑变化。相反看起来像

如果我使用data = xr.open_dataset('path/to/file', mask_and_scale=False) 导入,那么数据是平滑的

但这不是很有用,因为它不包含我需要的信息(未缩放)。 在我看来,存在精度问题,即数据中的“平滑度”处于太高的小数位并且已经丢失。

所以我的问题是,在使用比例因子和偏移量的同时,有没有办法在导入时提高精度,以使数据保持平滑,而不是逐步进行?也许使用decimal 模块或其他什么?

或者,有没有办法分别导入存储的数据、比例因子和偏移量。然后将它们应用到我的 python 脚本中,在那里我可以执行更好的精度?

到目前为止,我已经尝试了几种不同的方法,但似乎没有任何效果。 提前感谢您的帮助。

【问题讨论】:

  • scale_factoradd_offset 可以从 DataArray encoding 属性中检索。在您的情况下,我会尝试 data.lon.encoding 使用 mask_and_scale=False 检索这些值。

标签: python python-3.x precision netcdf python-xarray


【解决方案1】:

这是一个格式错误的变量。 scale_factoradd_offset 应该只注释已打包的数据(例如,short),但此变量与那些打包属性具有相同的数字类型。

针对以下问题的扩展答案: 恕我直言坐标(纬度,经度)应该很少打包。也就是说,要正确打包此示例中的坐标,可以使用指定的因子缩放和偏移坐标,然后将数组降级并保存为比原生 4 需要更少存储空间的任何数据类型(例如,2 字节短) -byte 浮点数据,然后ncdump 将显示short lon(lon),其他所有内容都相同。 xarray 似乎对格式错误的数据感到困惑,并在输入时对其进行量化。

【讨论】:

  • 太棒了,谢谢。我没有编写生成输出的代码,因此感谢您指出问题所在。从我的阅读来看,我是否正确地说在偏移和缩放后数据应该作为 int 写入文件?出于兴趣,为什么这会导致我看到的问题 - 这是我在问题中建议的精度问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2022-06-24
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2013-05-26
相关资源
最近更新 更多