当前位置: 首页 > 知识库问答 >
问题:

使用python将数字列表压缩到唯一的不重叠时间范围

岑鸣
2023-03-14

我来自生物学,对python和ML非常陌生,实验室有一个blackbox ML模型,输出如下序列:

Predictions =
[1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0]  

每个值表示持续时间为0.25秒的预测时间帧。
1表示高。
0表示不高。

如何将这些预测转换为[开始、停止、标签]
以便将更长的序列分组,例如,前10个序列表示0到10*。因此,第一个范围和标签为

[[0.0,2.5, High]
接下来有13个零===

因此,最终列表类似于列表/范围的列表,具有唯一的非重叠间隔以及标签,如:

[[0.0,2.5, High],
[2.5, 5.75, Not-High],
[5.75,6.50, High] ..

我尝试过的:
1.计算预测
中的值数2.生成两个范围,一个从零开始,另一个从0.25开始
3.将这两个列表合并为元组

import numpy as np  
len_pred = len(Predictions) 
range_1 = np.arange(0,len_pred,0.25)
range_2 = np.arange(0.25,len_pred,0.25)
new_range = zip(range_1,range_2)  

在这里,我可以得到范围,但错过了标签<这似乎是个简单的问题,但我在兜圈子。

请告知。谢谢

共有3个答案

柯栋
2023-03-14

如果我对你的理解是正确的,我认为这样的事情应该有用。

compact_prediction = list()
sequence = list()  # This will contain each sequence list [start, end, label]

last_prediction = 0

for index, prediction in enumerate(Predictions):
    if index == 0:
        sequence.append(0)  # It's the first sequence, so it will start in zero

    # When we not talking about the prediction we only end the sequence
    # when the last prediction is different from the current one, 
    # signaling a change
    elif prediction != last_prediction:
        sequence.append((index - 1) * 0.25) # We append the end of the sequence

        # And we put the label based on the last prediction
        if last_prediction == 1:  
            sequence.append('High')
        else:
            sequence.append('Not-High')

        # Append to our compact list and reset the sequence
        compact_prediction.append(sequence)
        sequence= list()

        # After reseting the sequence we append the start of the new one
        sequence.append(index * 0.25)

    # Save the last prediction so we can check if it changed
    last_prediction = prediction

print(compact_prediction)

结果:[[0.0,2.25,'High'],[2.5,5.5,'不高'],[5.75,6.25,'High'],[6.5,6.5,'不高'],[6.75,6.75,'High'],[7.0,7.0,'不高'],[7.25,7.25,'High'],[7.5,7.5,'不高'],[7.75,7.75,'High'],[8.0,8.0,'不高'],[8.25,9.25,'High'],[9.5,10.0,'不高'],[10.25, 11.5,'High']]

魏航
2023-03-14

通过使用diff()其中()您可以找到值更改的所有索引:

import numpy as np

p = np.array([1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0])

idx = np.r_[0, np.where(np.diff(p) != 0)[0]+1, len(p)]
t = idx * 0.25

np.c_[t[:-1], t[1:], p[idx[:-1]]]

输出:

array([[  0.  ,   2.5 ,   1.  ],
       [  2.5 ,   5.75,   0.  ],
       [  5.75,   6.5 ,   1.  ],
       [  6.5 ,   6.75,   0.  ],
       [  6.75,   7.  ,   1.  ],
       [  7.  ,   7.25,   0.  ],
       [  7.25,   7.5 ,   1.  ],
       [  7.5 ,   7.75,   0.  ],
       [  7.75,   8.  ,   1.  ],
       [  8.  ,   8.25,   0.  ],
       [  8.25,   9.5 ,   1.  ],
       [  9.5 ,  10.25,   0.  ],
       [ 10.25,  11.75,   1.  ],
       [ 11.75,  12.  ,   0.  ]])
曾典
2023-03-14

您可以遍历列表并在检测到更改时创建一个范围。使用此方法时,您还需要考虑最终范围。可能不是非常干净,但应该是有效的。

current_time = 0
range_start = 0
current_value = predictions[0]
ranges = []
for p in predictions:
  if p != current_value:
    ranges.append([range_start, current_time, 'high' if current_value == 1 else 'not high'])
    range_start = current_time
    current_value = p
  current_time += .25
ranges.append([range_start, current_time, 'high' if current_value == 1 else 'not high'])

已更新以修复一些由一种类型关闭的错误。

 类似资料:
  • 问题内容: 我有一个元组列表,每个元组都是一个。我正在尝试合并所有重叠的时间范围,并返回不同时间范围的列表。例如 这是我的实现方法。 我想弄清楚是否 是某些python模块中的内置函数可以更有效地做到这一点吗?要么 有没有达到相同目标的更Python方式? 感谢您的帮助。谢谢! 问题答案: 使用Pythonic可以提高效率的几种方法: 消除了构造,因为该算法应在主循环中删除重复项。 如果只需要遍历

  • 看起来像这样 对于 中的唯一值,我想将列的唯一值转换为列。从某种意义上说,我试图“取消堆叠”值作为列标题,行值将是中的值。我的主要问题是我没有计算任何数字数据 - 它都是文本 - 我只是试图重塑结构。 这是我们想要的结果: 我试过:,,,,。 这几乎让我到达那里,但不完全是,而且似乎不是很简洁: 这个问题展示了如何用数据透视表来做这件事..但是我并不关心数字索引。 这个问题展示了如何用数据透视表来

  • 问题内容: 我有两个清单 我想将这两个列表合并(压缩)到一个列表中,这样 Python的标准库中是否有任何函数可以做到这一点? 问题答案: 通常,您使用以下方法: 但是用s(或您作为参数传递的任何值)填充较短的可迭代项。如果这不是您想要的,则可以使用一种理解来过滤s: 但是请注意,如果两个可迭代对象都具有值,则也会将其过滤掉。如果您不想这样做,请定义自己的对象并过滤该对象,而不是: 在Python

  • 希望我能在这里找到我的难题的答案。 我在Postgres DB中有两个表,我想重叠到另一个表上。 表A有3列:“开始时间”、“结束时间”和“状态”。在每一行中,开始时间等于前一行的结束时间。 表B具有相同的列,但开头 我想将表B重叠到表A上以创建表C。 表C中每一行的开始时间也等于前一行的结束时间。 下面是一个例子来说明: 表A-受影响者 表B-重叠器 表C重叠的结果 如您所见,如果表B中的行的开

  • 问题内容: T-SQL DateTime问题。 我有一组时间范围。在这些时间范围内,可能会有一组重叠的时间范围,我称之为“封锁”时间。封锁的时间不会超过一天。我想要做的是分配时间以排除阻塞时间,基本上是给我没有“阻塞”的时间范围。可以肯定的是,阻塞时间不能超出时间范围。 示例:我工作时间是从上午9点到下午5点,在下午1点有30分钟的午餐时间。我想要2行的结果:9am至1pm和1.30pm至5pm。

  • 问题内容: 伙计们 我正在尝试找到问题的最优雅解决方案,并且想知道python是否为我想做的事情内置了任何东西。 我正在做的是这个。我有一个列表,并且我有一个接受项目并返回列表的函数。我可以使用列表推导来转换所有内容,例如: 但这返回一个列表列表; 我真正想要的是获取扁平化的列表; 现在,其他语言也有它。传统上用函数式编程语言来称呼它,而.Net称它为。python有类似的东西吗?有没有一种巧妙的