最近在处理SMAP_level2c_sss数据时,再进行偏差估计时发现数据存在问题,根据卫星图像对比,发现在数据筛选之前未进行质量控制,因此有较大的问题。再次,进行一定的总结:
一、二进制与十进制
在此之前,先让我们简单了解一下基础知识吧~
什么是二进制?
二进制是计算机中广泛采用的一种算法。二进制数据是用0和1两个数码来表示的数,所以显示出来的数只有0、1。进位规则是“逢二进一”。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。
计算机内部表示数的字节单位是定长的,如8位,16位,或32位。
八位就是:0000 0000
其他类推
假如按照4位二进制的数进行转换,先看一张表格对比一下:
不难看出其规律:按照从右向左排序的方式,十进制转为二进制时依次为
举个栗子,
所以转换后就应该是:0101
这样说是不是一下子就明白了呐~~
还是不理解的自己上网看看视频就行啦~~
二、位运算符
在python中,位运算按照数据在内存中的二进制位(Bit)进行操作,同时, 位运算符只能用来操作整数类型,按照整数在内存中的二进制形式进行计算。具体的位运算符如下表所示:
简单来说,将两个十进制数进行比较,假如有4位二进制数
0000
a&b的意思是:a、b中对应的二进制位数进行比较,两个位都为 1 时,结果才为 1,否则为 0。
举个例子:
a=4 #二进制为:0100 b=5 #二进制为:0101 c=a&b #既二进制对应比较 0100 # 0101 #同时为1,则对应位数显示为1,否则为0 #对应结果应该是:0100
最终显示的是十进位的结果!
理,其他的就好明白啦~
a|b:
两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0
a^b:
参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。
“~” :
对参与运算的二进制位取反 .如~ 1为0,~0为1
<<:
将各个二进制位全部左移若干位,高位丢弃,低位补 0。由 << 右边的数字指定了移动的位数。
“>>”:
将左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
三、如何进行位运算
下面针对我的smap盐度数据进行处理,通过查阅手册得知我的qc_flag为32 bit(位数)
每一位都表示一定的误差,当位数为0时,表示无表中体现的误差,位数为1时,有表中体现的误差。
简单来说,qc_flag中有1就说明,32 bit中有一位对应着一定的问题,可能是:陆地污染、风俗太大、银河辐射等等、、、
知道每一位对应的问题,我们再进行质量控制时,即可按需对比,比如我们想要风速小的数据,只有筛选(表中第12位)的数据是0的数据。
ok,下面打开nc文件中的iqc_flag,它告诉了我们如何比较你想要的位数:
开发现,这些数字都是2的几次方(十进制数),这就告诉我们:
如果你想比较数据的第一位(时,将数据与1进行 & 比较
如果想比较第 8 bit ,将数据与256 进行比较 & 即可
import numpy as np import netCDF4 as nc filename ='G:\\SMAP\\01\\RSS_SMAP_SSS_L2C_r26542_20200120T090520_2020020_FNL_V04.0.nc' f1 = nc.Dataset(filename)# sss_smap_40km = f1.variables['sss_smap_40km'][:].data sss_flg=f1.variables['iqc_flag'][:].data #========================================================== sss=np.array(sss_smap_40km[:,:,0]) qc=np.array(sss_flg[:,:,0]) # 比较第一位 bit result=(qc&1) # 取出质量控制之后的sss sss_result=sss[result] # 比较第八位 bit result1=(qc&256)
当然,一般来说,我们肯定只想要最好的数据(没有上述表中所说明的问题),既 32 bit 中每一位都是0的数据,这样子就很简单啦
直接令所有的qc数据值等于0,再取出需要的数据即可:
import numpy as np import netCDF4 as nc filename ='G:\\SMAP\\01\\RSS_SMAP_SSS_L2C_r26542_20200120T090520_2020020_FNL_V04.0.nc' f1 = nc.Dataset(filename)# sss_smap_40km = f1.variables['sss_smap_40km'][:].data sss_flg=f1.variables['iqc_flag'][:].data #========================================================== sss=np.array(sss_smap_40km[:,:,0]) qc=np.array(sss_flg[:,:,0]) # 比较第一位 bit result=(qc==0) # 取出质量控制之后的sss sss_result=sss[result]
下面再进行你需要的处理(取出无效值)就可以啦~~
一个努力学习python的海洋小白 水平有限,欢迎指正!!! 欢迎评论、收藏。