应用背景:
某地理区域,某指标在区域内不同的位置、不同的时间均有变化,且其变化有一定的大趋势和随机的小波动,但表现为关于地表二维位置和时间的连续变量。该指标数据的采集,是空间和时间上分别离散化实施的,具体离散方式是:时间按照时间间隔(等间隔或不等间隔)划分为多个时间点,记录各时间点的数据;空间按照一定规则划分为多个小格,每个小格每个时间点采用一个数据代表该小格的指标值。采集数据的具体组织方式是,数据按照时间点分层,每层数据保存的是同一个时间点的区域内各个小格的数据;每层数据按照相同的规则存储各个小格在对应时间点的指标值。受观测、天气等多种因素影响,部分位置在部分时间点的数据可能是无效的,对于无效的数据,有特定的措施记录于数据集中。
应用需求:
对包含无效值的同一地理区域的多个时间点采集的数据,逐小格进行统计。统计过程中,每一小格的数据,只有有效的数据参与统计,无效的不参与统计。
数学表述:
多层二维数据(层对应应用背景中所说的时间点,二维对应应用背景中所说的地理区域的离散化结果),指定层指定二维位置的数据称为一个数据点,各数据点有有效性标记,以指示该数据点的值是有效的还是无效的。对该多层二维数据,按照二维位置逐位置对该位置对应的各层数据进行极值和均值统计,原则是只对有效的数据进行统计,无效的数据不参与统计。
问题分析:
上述多层数据的统计,其极简形式是两层数据按照上规则的统计。解决了两层数据按照上述原则的统计问题,超出两层的数据可能可以以迭代的方式进行处理。
下面针对两层数据进行推导:
最小值:
真值表如下
层1 |
无效 |
无效 |
有效 |
有效 |
层2 |
无效 |
有效 |
无效 |
有效 |
Min(层1,层2) |
无效 |
层2 |
层1 |
Min(层1,层2) |
最大值:
真值表如下
层1 |
无效 |
无效 |
有效 |
有效 |
层2 |
无效 |
有效 |
无效 |
有效 |
Max(层1,层2) |
无效 |
层2 |
层1 |
Max(层1,层2) |
均值:
真值表如下
层1 |
无效 |
无效 |
有效 |
有效 |
层2 |
无效 |
有效 |
无效 |
有效 |
Mean(层1,层2) |
无效 |
层2 |
层1 |
Mean(层1,层2) |
可见,对于极值及均值的统计具体规则相仿,即两层都无效,结果无效;两层只有一层有效,则取有效层的数据;两层都有效,则按照对应的规则处理。
需要注意的是:极值运算的最终结果,只与输入数据中的一个有关,姑且称之为无扩散性,不难推得,对于多于两层的数据,按照两层的规则进行迭代处理,不影响结果的正确性;均值计算的最终结果,与所有有效的输入数据都有关,相应的,称之为有扩散性,对于多于两层的数据,如果简单按照两层的规则进行迭代处理,会导致(按照输入的顺序)历史越久远的数据,在最终结果中所占的比重越小,而按照均值的定义,各个有效值所占的比重应该是相等的,故对多于两层的数据按照两层数据简单迭代处理将得到错误的结果。所以,均值的计算需要单独处理。
多层数据的逐位置均值计算,方式之一如下:
将每层数据按照有效性生成数组,有效的位置为1,无效的位置为0,得到各位置值为0或者1的数组,方便后面的叙述起见,称之为有效性数组。每层数据都有自己独立的有效性数组。记第n层数据为Dn,其对应的有效性数组为Vn。
各层数据分别乘以对应的有效性数组,将会得到一个新的数组,方便后面的叙述起见,称之为有效数组,记为DV0、DV1、…DVn,那么
DVn = Dn * Vn
此处及之后所说的数组的四则运算,都是指的向量运算,即相同位置的数字参与运算,运算结果仍对应该位置。这有别于矩阵的运算。
可知,数组DVn保留了数组Dn中有效的值,数组Dn中无效的值在DVn中对应的位置为0。
将各层有效数组DV0、DV1、…、DVn按向量加求和,得到一层数据(一个二维数组)SD,即有效数组加和
SD = sum(DV0, DV1, …, DVn)
将各层有效性数组V0、V1、…、Vn按向量加求和,得到一层数据(一个二维数组)SV,即有效性数组加和
SV = sum(V0, V1, …, Vn)
有效数组加和SD除以有效性数据加和SV,得到有效数局的均值数组MVD,即
MVD = SD / SV
该结果符合运算该场景均值统计运算规则。
该过程中需要注意的是,如果是按照向量运算(如使用Python的Numpy.array)进行处理,需要避免上面除法运算中的0除错误。原因是,可能存在某些位置,其所有层的数据都是无效的,那么有效性加和数组SV在该位置的值为0,如果按照向量除法进行运算,该位置将出现0除错误。
在使用向量运算处理时,避免0除错误的思路之一是,在做除法之前,将有效性加和数组SV的值为0的位置的值置为非0值。对应方法之一如下:
根据有效性数据加和数组SV各位置的值为0和非0,对应分别生成掩膜层。0值掩膜数组M0在对应有效性数据加和数组SV值为0的位置的值为1,其它为0;非0掩膜数组N0在对应有效性数据加和数组SV为0的位置的值为0,其它为1。在做除法的时候,用有效性数据加和数组SV和0值掩膜层数组M0的向量和作为除数,即用
MVD = SD / (SV + M0)
代替
MVD = SD / SV
在不影响结果正确性的情况下,避免了可能出现的0除错误。
如果有需要,上述结果MVD再乘以非零掩膜数N0,将无效位置的非0值置为0。
附言:如果要根据统计出来的极值和均值做数据分级,那么在生成0值掩膜数组M0和非0掩膜数组N0数据的时候,应该根据分级的级数选定阈值,有效性加和数组与阈值进行比较,比较结果作为对应位置0值掩膜数组M0和非0掩膜数组N0的值是0还是1的依据。