计算数组中的数字序列?

von4xj4u  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(292)

对于一年的数据,我有以下数据框架:

lat     lon     date         month  ssta        90th        10th    threshold   year   dayofyear
21680   30.375  273.875 1982-01-01     1    0.995117    1.566498    -1.620501       0   1982        1
21681   30.375  273.875 1982-01-02     1    1.765118    1.566498    -1.620501       1   1982        2
21682   30.375  273.875 1982-01-03     1    2.495117    1.566498    -1.620501       1   1982        3
....

我使用以下代码计算阈值以上/以下的连续天数序列(1=高于,-1=低于,0=介于两者之间):

aok = year['threshold'].values
for i in range(1, len(aok)):
    if aok[i] == 1:
        aok[i] += aok[i - 1]
    if aok[i] == -1:
        aok[i] += aok[i - 1]

它生成一个数组,如下所示,总结了这一年:

array([  0,   1,   2,   0,   0,   0,  -1,  -2,  -3,   0,  -1,  -2,   0,
         0,   0,   0,   0,   0,   0,   0,   0,  -1,  -2,  -3,  -4,  -5,
        -6,  -7,  -8,  -9, -10, -11, -12, -13, -14, -15, -16, -17, -18,
       -19, -20, -21, -22, -23, -24, -25,   0,   0,   0,   0,   0,   0,
         0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  1,
        2,  3,  4,  5,  6,   0,   0,   1,   2,   3,   4,   5,   6,  7])
(shortened for brevity; has a len of 365 )

我的问题是。是否有方法返回大于等于5和小于等于-5的序列数?我正在统计连续5天或以上高于/低于阈值的事件。例如,在上面的数组中,我知道我可以找到最大值和最小值。。我还知道我可以使用np.count\u nonzero(aok>=5)来计算阈值以上的天数。我会有一个低于平均水平的活动,持续25天,和两个高于平均水平的活动,一个持续6天,另一个持续7天。
我如何在单独的事件中返回这些信息,可能是以[-25,6,7]这样的列表形式?
太长,读不下去了如何以[-25,6,7]等形式对事件(即以0分隔的>=5和<=-5的数字序列)进行计数,如上述示例数组中所示

tjrkku2a

tjrkku2a1#

如果我理解正确的话,你只是在寻找相邻的值,它们之间的值相差超过5?!如果是这样的话,您可以将数组移位1,然后像这样进行比较

arr[np.argwhere(np.abs(arr-np.roll(arr,-1)) >= 5)]

这几乎可以作为3,1数组提供所需的输出。如果这让你烦恼的话

arr[np.argwhere(np.abs(arr-np.roll(arr,-1)) >= 5)].reshape(-1)

相反
我怀疑您的第一次计算可以以非常类似的方式进行,但由于您没有询问,也没有提供原始数据(阈值),因此我将不多说。也许你可以做一个有趣的裸体运动:)。

相关问题