算法计算两个事件之间有多少观察值

2024-04-19 12:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要开发一种算法,能够计算从一个事件(发生率为真/假存储在列表Vec1中)到另一个事件(发生率为真/假存储在列表Vec2中)的“天数”。两份清单如下:

Vec1 = [True, False, False, False, False, True, True, True, False, True, True, True, False, True, False, True, False, False, False, True]
Vec2 = [True, False, False, True, True, True, False, True, False, True, True, True, False, True, True, True, True, False, False, True]

为了得到更好的解释,假设Vec1回答“约翰今天喝咖啡了吗?”而Vec2的答案是“保罗今天喝咖啡了吗?”。所以,我想用这个指标得到的是事件“John drinks”和事件“Paul drinks”之间经过的天数。逻辑结构如下:

1)在第一个向量中找到值“True”,并从那天开始计数; 2) 继续计数,直到找到第二个向量中的“真”,从那一刻起重置计数器。你知道吗

要填充结果的空列表:

ValueInd = []

到目前为止,我已经建立了:

trueVector1 = 0
trueVector2 = 0
countAct = False
Count = 0

while len(ValueInd) < len(Vec1):
    while Vec1[trueVector1] == False:
        ValueInd.append(Count)
        trueVector1 += 1
    countAct = True
    trueVector2 = trueVector1
    while countAct == True:
        if Vec2[trueVector2] == True:
            countAct = False
            ValueInd.append(Count)
            Count = 0
            trueVector1 = trueVector2 + 1
        else:
            ValueInd.append(Count)
            trueVector2 += 1
            Count += 1

除了现在算法的可怕结构(我稍后会修改)之外,我无法得到一个正确的解决方案,因为这个解决方案不起作用。而根据我上面提供的数据,正确的输出应该是:

ValueInd = [0,0,0,0,0,0,0,1,1,2,1,1,0,1,2,1,0,0,0,0]

我实际得到的结果是:

ValueInd = [0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0]

有人能帮我吗?请询问您是否需要进一步的解释。你知道吗

示例 在15天的日历上,约翰在第0、4、5、8、10天喝咖啡。保罗在15天日历的第2、4、7、8、11天喝咖啡。因此,出现向量为:

John = [T, F, F, F, T, T, F, F, T, F, T, F, F, F, F, F]
Paul = [F, F, T, F, T, F, F, T, T, F, F, T, F, F, F, F]

本例中的结果向量为:

Days = [0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0]

这是因为: 0)约翰喝酒,保罗不喝酒,所以计数从0开始; 1) 没有人喝咖啡,因此计数增加到1; 2) 保罗喝酒,所以计数增加到2,然后关闭; 3) 未激活计数; 4) 两种饮料,因此计数在同一天以0开始和结束; 5) 约翰喝酒,保罗不喝酒:所以计数被激活,从零开始; 6) 一天不喝酒->;计数=1 7) Paul喝酒->;count=2并重置为0 8) 两个人都喝酒,所以计数从0开始,在同一天结束 9) 约翰喝酒,所以计数从0开始 10) 保罗喝酒,所以数到1 11-15)没有喝酒,所以计数总是零。你知道吗


Tags: falsetrue列表count事件向量计数while
1条回答
网友
1楼 · 发布于 2024-04-19 12:14:06

以下工作

def get_counts(Vec1, Vec2):
    c = 0
    counts = []
    counting = False
    for v1, v2 in zip(Vec1, Vec2):
        counts.append(c)
        if v1:
            counting = True
            c = 0
        if v2:
            counting = False
            c = 0
        if counting:
            c += 1

例如

T = True
F = False
John = [T, F, F, F, T, T, F, F, T, F, T, F, F, F, F, F]
Paul = [F, F, T, F, T, F, F, T, T, F, F, T, F, F, F, F]
get_counts(John, Paul)

>>  [0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0]

相关问题 更多 >