Python 如何以与原始NetCDF浮点值相同的精度和比例将NetCDF变量浮点数据读入Numpy数组?

Python 如何以与原始NetCDF浮点值相同的精度和比例将NetCDF变量浮点数据读入Numpy数组?,python,numpy,netcdf,Python,Numpy,Netcdf,我有一个NetCDF文件,其中包含一个浮点值为精度/刻度==7/2的变量,即可能存在-99999.99到99999.99之间的值 当我从NetCDF变量中提取一部分值并在调试器中查看它们时,我发现现在数组中的值比原始NetCDF中的值具有更高的精度/比例。例如,当我查看ToosUI/ncdump查看器中的值时,它们显示为“-99999.99”或“12.45”,但当我查看切片数组中的值时,它们看起来像“-99999.9921875”(更大的标度长度)。因此,如果我使用“-99999.99”作为预期

我有一个NetCDF文件,其中包含一个浮点值为精度/刻度==7/2的变量,即可能存在-99999.99到99999.99之间的值

当我从NetCDF变量中提取一部分值并在调试器中查看它们时,我发现现在数组中的值比原始NetCDF中的值具有更高的精度/比例。例如,当我查看ToosUI/ncdump查看器中的值时,它们显示为“-99999.99”或“12.45”,但当我查看切片数组中的值时,它们看起来像“-99999.9921875”(更大的标度长度)。因此,如果我使用“-99999.99”作为预期值来指示缺少的数据点,那么我将无法获得与切片数组中拉入的内容匹配的结果,因为这些值具有更大的刻度长度,并且刻度中的附加数字不仅仅是用于填充的零

例如,如果我在NetCDF数据集中的某个点上执行ncdump,我会看到:

Variable: precipitation(0:0:1, 40:40:1, 150:150:1)

float precipitation(time=1348, lat=180, lon=360);
  :units = "mm/month";
  :long_name = "precipitation totals";

 data:

  {
    {
      {-99999.99}
    }
  }
但是,如果我从变量中获取一部分数据,如下所示:

value = precipitationVariable[0:1:1, 40:41:1, 150:151:1]
然后,我在我的调试器(Eclipse/PyDev)中看到它是这样的:

因此,我读取到Numpy数组中的NetCDF数据集值的读取精度/比例似乎与NetCDF文件中的原始值不同。或者,NetCDF中的值实际上与我读取它们时看到的值相同,但由于ncdump程序本身的某些格式设置,通过ncdump向我显示的内容被截断

有人能告诉我这里发生了什么事吗?提前感谢你的帮助


顺便说一句,我在Windows XP机器上使用Python 2.7.3开发这段代码,并使用此处提供的NetCDF4 API的Python模块:

没有简单的方法可以实现您想要的功能,因为numpy将值存储为单精度,所以它们的尾随数字总是在0.99之后

但是,netCDF已经为丢失的数据提供了一种机制(请参阅)。netCDF文件最初是如何编写的?
missing_值
是一个用于指示缺少的值的值。在C和Fortran接口中,创建文件时,所有变量值都设置为缺失。如果一次性编写变量,则可以将
missing_value
属性设置为缺少值的索引数组。有关和接口中的填充值的详细信息,请参见。这是推荐的方法。python netCDF4模块很好地处理了这些缺失的值,并且在numpy中,这些数组被读取为屏蔽数组

如果您必须使用当前拥有的文件,那么我建议创建一个掩码来覆盖丢失值周围的值:

import numpy as np
value = precipitationVariable[:]
mask = (value < -99999.98) & (value > -100000.00) 
value = np.ma.MaskedArray(value, mask=mask)
将numpy导入为np
值=沉淀变量[:]
掩码=(值<-99999.98)和(值>-100000.00)
值=np.ma.MaskedArray(值,mask=mask)

谢谢,@tiago,您的回复写得很好,内容丰富。
import numpy as np
value = precipitationVariable[:]
mask = (value < -99999.98) & (value > -100000.00) 
value = np.ma.MaskedArray(value, mask=mask)