我需要知道存储在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文件中存储的数据的有效位数?。
答案 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的冗长精确讨论中定义。