如何计算 bash 中 netcdf 文件中随时间维度求和的缺失值数量
How to calculate number of missing values summed over time dimension in a netcdf file in bash
我有一个 netcdf 文件,其中的数据是经度、纬度和时间的函数。我想计算在时间维度上求和的每个网格单元格中缺失条目的总数,最好使用 CDO 或 NCO,这样我就不需要调用 R,python 等
我知道如何得到缺失值的总数
ncap2 -s "nmiss=var.number_miss()" in.nc out.nc
当我回答这个相关问题时:
CDO 可以告诉我 space 和
的总和
cdo info in.nc
但我不知道如何随着时间的推移求和。有没有一种方法可以指定要在 ncap2 中用 number_miss 求和的维度?
尽管您要求的是另一种解决方案,但我想向您展示,在 Python 的帮助下,只需要很短的一行就可以找到答案。变量 m_data
与使用 netCDF4
包读取缺失值的变量具有完全相同的形状。只需执行一个指定了正确轴的 np.sum
命令,您就有了答案。
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc4
# Generate random data for this experiment.
data = np.random.rand(365, 64, 128)
# Masked data, this is how the data is read from NetCDF by the netCDF4 package.
# For this example, I mask all values less than 0.1.
m_data = np.ma.masked_array(data, mask=data<0.1)
# It only takes one operation to find the answer.
n_values_missing = np.sum(m_data.mask, axis=0)
# Just a plot of the result.
plt.figure()
plt.pcolormesh(n_values_missing)
plt.colorbar()
plt.xlabel('lon')
plt.ylabel('lat')
plt.show()
# Save a netCDF file of the results.
f = nc4.Dataset('test.nc', 'w', format='NETCDF4')
f.createDimension('lon', 128)
f.createDimension('lat', 64 )
n_values_missing_nc = f.createVariable('n_values_missing', 'i4', ('lat', 'lon'))
n_values_missing_nc[:,:] = n_values_missing[:,:]
f.close()
从 NCO 4.6.7(2017 年 5 月)开始,我们向 ncap2 添加了 missing() 函数以优雅地解决这个问题。通过时间计算缺失值:
ncap2 -s 'mss_val=three_dmn_var_dbl.missing().ttl($time)' in.nc out.nc
这里 ncap2 将两个方法链接在一起,missing(),然后是时间维度上的总数。二维变量 mss_val 在 out.nc 中。下面的响应做同样的事情,但平均超过 space 并随时间报告(因为我误解了 OP)。
Old/obsolete回答:
使用 NCO/ncap2 有两种方法可以做到这一点,但都没有我想要的那么优雅。通过一次一条记录调用 num_miss() 来一次一条记录地调用 assemble 答案,或者(我的偏好)使用布尔比较函数,然后沿选择轴使用总运算符:
zender@aerosol:~$ ncap2 -O -s 'tmp=three_dmn_var_dbl;mss_val=tmp.get_miss();tmp.delete_miss();tmp_bool=(tmp==mss_val);tmp_bool_ttl=tmp_bool.ttl($lon,$lat);print(tmp_bool_ttl);' ~/nco/data/in.nc ~/foo.nc
tmp_bool_ttl[0]=0
tmp_bool_ttl[1]=0
tmp_bool_ttl[2]=0
tmp_bool_ttl[3]=8
tmp_bool_ttl[4]=0
tmp_bool_ttl[5]=0
tmp_bool_ttl[6]=0
tmp_bool_ttl[7]=1
tmp_bool_ttl[8]=0
tmp_bool_ttl[9]=2
或
zender@aerosol:~$ ncap2 -O -s 'for(rec=0;rec<time.size();rec++){nmiss=three_dmn_var_int(rec,:,:).number_miss();print(nmiss);}' ~/nco/data/in.nc ~/foo.nc
nmiss = 0
nmiss = 0
nmiss = 8
nmiss = 0
nmiss = 0
nmiss = 1
nmiss = 0
nmiss = 2
nmiss = 1
nmiss = 2
我有一个 netcdf 文件,其中的数据是经度、纬度和时间的函数。我想计算在时间维度上求和的每个网格单元格中缺失条目的总数,最好使用 CDO 或 NCO,这样我就不需要调用 R,python 等
我知道如何得到缺失值的总数
ncap2 -s "nmiss=var.number_miss()" in.nc out.nc
当我回答这个相关问题时:
CDO 可以告诉我 space 和
的总和cdo info in.nc
但我不知道如何随着时间的推移求和。有没有一种方法可以指定要在 ncap2 中用 number_miss 求和的维度?
尽管您要求的是另一种解决方案,但我想向您展示,在 Python 的帮助下,只需要很短的一行就可以找到答案。变量 m_data
与使用 netCDF4
包读取缺失值的变量具有完全相同的形状。只需执行一个指定了正确轴的 np.sum
命令,您就有了答案。
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc4
# Generate random data for this experiment.
data = np.random.rand(365, 64, 128)
# Masked data, this is how the data is read from NetCDF by the netCDF4 package.
# For this example, I mask all values less than 0.1.
m_data = np.ma.masked_array(data, mask=data<0.1)
# It only takes one operation to find the answer.
n_values_missing = np.sum(m_data.mask, axis=0)
# Just a plot of the result.
plt.figure()
plt.pcolormesh(n_values_missing)
plt.colorbar()
plt.xlabel('lon')
plt.ylabel('lat')
plt.show()
# Save a netCDF file of the results.
f = nc4.Dataset('test.nc', 'w', format='NETCDF4')
f.createDimension('lon', 128)
f.createDimension('lat', 64 )
n_values_missing_nc = f.createVariable('n_values_missing', 'i4', ('lat', 'lon'))
n_values_missing_nc[:,:] = n_values_missing[:,:]
f.close()
从 NCO 4.6.7(2017 年 5 月)开始,我们向 ncap2 添加了 missing() 函数以优雅地解决这个问题。通过时间计算缺失值:
ncap2 -s 'mss_val=three_dmn_var_dbl.missing().ttl($time)' in.nc out.nc
这里 ncap2 将两个方法链接在一起,missing(),然后是时间维度上的总数。二维变量 mss_val 在 out.nc 中。下面的响应做同样的事情,但平均超过 space 并随时间报告(因为我误解了 OP)。
Old/obsolete回答:
使用 NCO/ncap2 有两种方法可以做到这一点,但都没有我想要的那么优雅。通过一次一条记录调用 num_miss() 来一次一条记录地调用 assemble 答案,或者(我的偏好)使用布尔比较函数,然后沿选择轴使用总运算符:
zender@aerosol:~$ ncap2 -O -s 'tmp=three_dmn_var_dbl;mss_val=tmp.get_miss();tmp.delete_miss();tmp_bool=(tmp==mss_val);tmp_bool_ttl=tmp_bool.ttl($lon,$lat);print(tmp_bool_ttl);' ~/nco/data/in.nc ~/foo.nc
tmp_bool_ttl[0]=0
tmp_bool_ttl[1]=0
tmp_bool_ttl[2]=0
tmp_bool_ttl[3]=8
tmp_bool_ttl[4]=0
tmp_bool_ttl[5]=0
tmp_bool_ttl[6]=0
tmp_bool_ttl[7]=1
tmp_bool_ttl[8]=0
tmp_bool_ttl[9]=2
或
zender@aerosol:~$ ncap2 -O -s 'for(rec=0;rec<time.size();rec++){nmiss=three_dmn_var_int(rec,:,:).number_miss();print(nmiss);}' ~/nco/data/in.nc ~/foo.nc
nmiss = 0
nmiss = 0
nmiss = 8
nmiss = 0
nmiss = 0
nmiss = 1
nmiss = 0
nmiss = 2
nmiss = 1
nmiss = 2