如何获取存储在NetCDF文件中的数据的有效位数?

时间:2017-08-22 16:49:58

标签: netcdf

我需要知道存储在NetCDF文件中的数据的精确度。

我认为可以知道这种精度,因为当我使用ncdump转储NetCDF文件时,显示的有效位数取决于我使用的特定NetCDF文件。

所以,我得到一个文件:

  

Ts = -0.2121478, -0.08816089, -0.4285178, -0.3446428, -0.4800949, -0.4332879, -0.2057121, -0.06589077, -0.001647412, 0.007711744,

另一个人:

  

Ts = -2.01, -3.6, -1, -0.53, -1.07, -0.7, -0.56, -1.3, -0.93, -1.41, -0.83, -0.8, -2.13, -2.91, -1.13, -1.2, -2.23, -1.77, -2.93, -0.7, -2.14, -1.36,

我还必须说,在任何属性中都没有关于精度的信息,无论是全局变量还是本地变量。您可以在NetCDF文件的标头转储中看到这一点:

netcdf pdo {
dimensions:
    time = UNLIMITED ; // (809 currently)
variables:
    double time(time) ;
            time:units = "months since 1900-01-01" ;
            time:calendar = "gregorian" ;
            time:axis = "T" ;
    double Ts(time) ;
            Ts:missing_value = NaN ;
            Ts:name = "Ts" ;

// global attributes:
            :Conventions = "CF-1.0" ;
}

有谁知道如何获取NetCDF文件中存储的数据的有效位数?。

2 个答案:

答案 0 :(得分:2)

这是一个棘手的问题:ncdump(以及许多其他漂亮的数字生成器)所做的只是从小数部分中删除尾随的零,但是这有关真实的事情(观察/计算/ ...) )值的精确度?以三位小数精度测量的内容可能为1.100,但ncdump仍会将其打印为1.1。如果你想知道真实(物理?)的意义,它确实必须作为属性包含在内,或者在其他地方记录。

对于大量数字,计算数字小数部分中的最大有效位数可能是精度的第一个指示。如果你正在寻找的东西,这样的东西可能在Python中起作用:

import numpy as np

a = np.array([1.01, 2.0])
b = np.array([1.10, 1])
c = np.array([10., 200.0001])
d = np.array([1, 2])

def count_max_significant_fraction(array):
    # Return zero for any integer type array:
    if issubclass(array.dtype.type, np.integer):
        return 0
    decimals = [s.rstrip('0').split('.')[1] for s in array.astype('str')]
    return len(max(decimals, key=len))

print( count_max_significant_fraction(a) )   # prints "2"
print( count_max_significant_fraction(b) )   # prints "1"
print( count_max_significant_fraction(c) )   # prints "4"
print( count_max_significant_fraction(d) )   # prints "0"

答案 1 :(得分:1)

我建议您采用NCO使用的约定并命名精度属性“number_of_significant_digits”和/或“least_significant_digit”。术语在开始here的冗长精确讨论中定义。