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

使用python将时间范围扩展为具有精确标签的更小增量的更多步骤

强烨
2023-03-14

我有一个带有时间戳和标签的文本文件,如下所示:

0.000000    14.463912   tone
14.476425   16.891247   noise
16.891247   21.232923   not_music
21.232923   23.172289   not_music
23.172289   29.128018   not_music

如果我指定1秒的步长。我希望这个列表爆炸成1秒长的时间帧,但仍然带有最近的标签。我如何将时间范围分解成更小的步骤,但有准确的标签?

例如,如果我的步长为1秒,则第一行将变为~14行,如:

0.0 1.0 tone
1.0 2.0 tone 
.  
.  
.
13.0 14.0 tone 
[14.0 , 14.46] and [14.47, 15.0] #fall in a grey zone , don't know 
what to do
15.0 16.0 noise

到目前为止,我已设法读入文本文件并将其存储在如下列表中:

my_segments =[]
for line in open('./data/annotate.txt', 'rb').readlines():
            start, end, label = line.split("\t")
            start = float(start)
            end = float(end)
            label = label.strip()
            my_segments.append((start, end, label))

# print my_segments
for i in range(len(my_segments)):
    print my_segments[i]

我看着https://stackoverflow.com/a/18265979/4932791由@Jared编写,详细介绍了如何使用numpy在给定步长的两个数字之间创建一个范围。像这样:

>>> numpy.arange(11, 17, 0.5)
array([ 11. ,  11.5,  12. ,  12.5,  13. ,  13.5,  14. ,  14.5,  15. ,
        15.5,  16. ,  16.5])

无法找出如何在一系列范围内执行类似操作。

我设法想出的伪代码/算法是:

  • 步骤1-采取步长,
  • 步骤2-将步长分配给left_variable和与步长相对应的right_variable
    步骤3-在每个范围内移动这个类似步长的窗口,并检查步长是否在范围内相应的标签。
  • 步骤4-现在更新左右1步。
  • 步骤5-重复步骤3直到文件结束。

我认为要处理边缘情况,我应该将步长减小到0.25秒或类似的时间,并设置一个条件,如果当前步长至少有40%或50%的重叠,那么我会相应地分配标签。

更新:我的非工作解决方案:

sliding_window = 0
#st,en = [0.0,1.0]
jumbo= []
for i in range(len(hold_segments)):
    if sliding_window > hold_segments[i][0] and sliding_window+1 < hold_segments[i][1]:
        jumbo.append((sliding_window,sliding_window+1,hold_segments[i][2]))
        sliding_window=sliding_window+1
        print hold_segments[i][2]

共有2个答案

暴乐邦
2023-03-14

我希望通过这些评论可以清楚地了解代码的作用。也适用于非整数步长

from __future__ import division
import numpy as np

my_segments = [
    (0, 14.46, "ringtone"),
    (14.46, 16.89, "noise"),
    (16.89, 21.23, "not_music"),
]


def expand(segments, stepsize):
    result = []
    levels = [x[0] for x in segments] + [segments[-1][1]] #0, 14.46, 16.89, 21.23
    i = 0   # tracks the index in segments that we need at the current step
    for step in np.arange(0, levels[-1], stepsize):

        # first check if the index needs to be updated
        # update when the next level will be reached at the next 'stepsize / 2'
        # (this effectively rounds to the nearest level)
        if i < len(levels) - 2 and (step + stepsize / 2) > levels[i+1]:
            i += 1

        # now append the values
        result.append((step, step + stepsize, segments[i][2]))

    return result

stepsize = 0.02
print len(expand(my_segments, stepsize))
print my_segments[-1][1] / stepsize

>>> 1062  # steps are rounded up
>>> 1061.5
卫成和
2023-03-14

对于pandas,这非常简单,假设您已将数据加载到名为df的数据帧中,例如:

df

               value        tag
index
0.000000   14.463912   ringtone
14.476425  16.891247      noise
16.891247  21.232923  not_music
21.232923  23.172289    music_B
23.172289  29.128018    music_A


df = df.reindex(
    [i + 0.5 for i in range(math.floor(df.index.min()), math.ceil(df.value.max()))], 
    method='pad'
)

然后使用以下命令恢复范围:

(df.index, df.value) = (df.index - 0.5, df.index + 0.5)

       value        tag
index
0.0      1.0   ringtone
1.0      2.0   ringtone
2.0      3.0   ringtone
3.0      4.0   ringtone
4.0      5.0   ringtone
5.0      6.0   ringtone
6.0      7.0   ringtone
7.0      8.0   ringtone
8.0      9.0   ringtone
9.0     10.0   ringtone
10.0    11.0   ringtone
11.0    12.0   ringtone
12.0    13.0   ringtone
13.0    14.0   ringtone
14.0    15.0      noise
15.0    16.0      noise
16.0    17.0      noise
17.0    18.0  not_music
18.0    19.0  not_music
19.0    20.0  not_music
20.0    21.0  not_music
21.0    22.0    music_B
22.0    23.0    music_B
23.0    24.0    music_A
24.0    25.0    music_A
25.0    26.0    music_A
26.0    27.0    music_A
27.0    28.0    music_A
28.0    29.0    music_A
29.0    30.0    music_A
 类似资料:
  • 我的目标是增加“收入 ($) " 和“年份”的大小。但是我不知道怎么做。我可以增加“苹果、榴莲、橘子”和“2012、2013”。 下面是我的代码。

  • 我有一个标签,这是使用了多次在我的网页。它工作得很好,直到我尝试按Ajax更新标签。结果:只有第一个标签得到更新。这是一个已知的问题吗?我不确定,因为我不能打开JIRA页面:https://issues.apache.org/JIRA/browse/wicket(一直在跳)。我使用的是wicket 7.3.0版本 =>只更新第一个标签。我有一个解决办法,通过添加4个不同的标签实例与相同的文本内容。

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

  • 问题内容: 我正在尝试检测具有扩展名列表的文件。 问题答案: 为此使用元组。 不必每次都转换,只需将其转换为元组一次即可。

  • 问题内容: 我需要确保数据库仅包含两个或两个以上列是唯一的条目。这可以很容易地通过对那些列的约束来实现。 就我而言,我只需要在重叠的时间范围内禁止重复。该表具有和列。在某些情况下,可能首先需要通过设置来使活动条目到期,然后插入调整为和的新条目。 使用似乎可以使先前的条目到期而没有任何问题,但是由于我的基本列当前为,因此插入新条目似乎很麻烦,因此无法再次添加。 我考虑添加和作为约束的一部分,但这只会

  • 我一直在探索构建我的ColdFusion应用程序的不同方法,我正在寻找一些关于提供应用范围UDF的最佳方式的意见。 对于我的每一个应用程序,我通常都会使用一些不属于任何特定对象的额外功能。主要是数据操作。我希望这些功能在我的整个应用程序中都可用,既可以在CFM模板中使用,也可以在应用程序实例化的CFC中使用。 在我看来,有各种各样的方法来实现这一点,但它们都有自己的局限性: > 创建一个基本的Ut