为了账号安全,请及时绑定邮箱和手机立即绑定

在二进制数组中强制最小间隔

在二进制数组中强制最小间隔

慕斯709654 2022-10-11 21:40:58
我有生成二进制信号的时间序列,如下所示:date    value1/4/1987    01/5/1987    11/6/1987    11/7/1987    01/9/1987    01/10/1987   11/12/1987   12/1/1987    12/2/1987    12/3/1987    12/4/1987    12/6/1987    12/7/1987    12/9/1987    02/10/1987   02/11/1987   02/12/1987   13/2/1987    03/3/1987    13/4/1987    13/6/1987    13/8/1987    13/9/1987    13/11/1987   13/12/1987   0我试图找出减少它们数量的方法,以便在 1 之间会有 10 个观察值的固定差距。date    new_value1/4/1987    01/5/1987    11/6/1987    01/7/1987    01/9/1987    01/10/1987   01/12/1987   02/1/1987    02/2/1987    02/3/1987    02/4/1987    02/6/1987    02/7/1987    12/9/1987    02/10/198    02/11/198    02/12/198    03/2/1987    03/3/1987    03/4/1987    03/6/1987    03/8/1987    03/9/1987    03/11/1987   13/12/1987   0非常感谢任何帮助。
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

看起来想出一种矢量化的方法来做到这一点可能非常棘手。对于这些情况numba,如果我们仍然想要一种高性能的方法,这可能是一个不错的选择。以下是使用其高效的@njit 编译模式的方法:


from numba import njit

import numpy as np


@njit

def spacing_between_1(a, k):

    x = np.zeros(len(a), np.int8)

    first_one = np.argmax(a)

    x[first_one] = 1

    c=0

    for i in range(first_one+1, len(x)):

        if a[i] == 1 and c >= k:

            x[i] = 1

            c=0

            continue

        c +=1

    return x

对于共享示例,我们将得到:


a = df.value.to_numpy()

df['new_value'] = spacing_between_1(a, 10)


print(df)


           value  new_value

date                       

1/4/1987       0          0

1/5/1987       1          1

1/6/1987       1          0

1/7/1987       0          0

1/9/1987       0          0

1/10/1987      1          0

1/12/1987      1          0

2/1/1987       1          0

2/2/1987       1          0

2/3/1987       1          0

2/4/1987       1          0

2/6/1987       1          0

2/7/1987       1          1

2/9/1987       0          0

2/10/1987      0          0

2/11/1987      0          0

2/12/1987      1          0

3/2/1987       0          0

3/3/1987       1          0

3/4/1987       1          0

3/6/1987       1          0

3/8/1987       1          0

3/9/1987       1          0

3/11/1987      1          1

3/12/1987      0          0


查看完整回答
反对 回复 2022-10-11
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号