我有一个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)中看到了这样的内容:
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/
最佳答案
没有简单的方法来执行所需的操作,因为numpy将值存储为单精度,因此它们始终具有0.99之后的尾随数字。
但是,netCDF已经提供了一种丢失数据的机制(请参阅best practices guide)。 netCDF文件是如何首先写入的? missing_value
是special variable attribute,应用于指示缺少的那些值。在C和Fortran接口(interface)中,创建文件时,所有变量值都设置为丢失。如果您一次性编写了一个变量,则可以将missing_value
属性设置为缺少值的索引数组。在C和Fortran接口(interface)中查看有关填充值的更多信息。这是推荐的方法。 python netCDF4模块可以很好地处理这些缺少的值,并且此类数组在numpy中作为掩码数组读取。
如果您必须使用当前拥有的文件,那么建议您创建一个掩码以覆盖缺少的值周围的值:
import numpy as np
value = precipitationVariable[:]
mask = (value < -99999.98) & (value > -100000.00)
value = np.ma.MaskedArray(value, mask=mask)
关于python - 如何将NetCDF变量浮点数据读取到与原始NetCDF浮点值相同的精度和小数位数的Numpy数组中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16845063/