我来自生物学,对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)
在这里,我可以得到范围,但错过了标签<这似乎是个简单的问题,但我在兜圈子。
请告知。谢谢
如果我对你的理解是正确的,我认为这样的事情应该有用。
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']]
通过使用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. ]])
您可以遍历列表并在检测到更改时创建一个范围。使用此方法时,您还需要考虑最终范围。可能不是非常干净,但应该是有效的。
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有类似的东西吗?有没有一种巧妙的