5

我有一个 NetCDF 文件,其中包含一个具有精度/比例 == 7/2 的浮点值的变量,即可能的值从 -99999.99 到 99999.99。

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

例如,如果我在 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)中看到它是这样的:

value == ndarray: [[[-99999.9921875]]]

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

任何人都可以就这里发生的事情提出建议吗?在此先感谢您的帮助。

顺便说一句,我正在 Windows XP 机器上使用 Python 2.7.3 开发此代码,并使用此处提供的 NetCDF4 API 的 Python 模块:https ://code.google.com/p/netcdf4-python/

4

1 回答 1

8

没有简单的方法可以做您想做的事情,因为 numpy 将值存储为单精度,因此它们将始终具有 0.99 之后的尾随数字。

但是,netCDF 已经提供了丢失数据的机制(请参阅最佳实践指南)。netCDF 文件最初是如何编写的?这missing_value是一个特殊的变量属性,应该用来指示那些缺失的值。在 C 和 Fortran 接口中,创建文件时,所有变量值都设置为缺失。如果您一次性编写了一个变量,则可以将该missing_value属性设置为缺少值的索引数组。查看有关CFortran接口中填充值的更多信息。这是推荐的方法。python netCDF4 模块可以很好地处理这些缺失值,并且这些数组在 numpy 中被读取为掩码数组。

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

import numpy as np
value = precipitationVariable[:]
mask = (value < -99999.98) & (value > -100000.00) 
value = np.ma.MaskedArray(value, mask=mask)
于 2013-05-31T08:02:28.140 回答