微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从时间点列表中随机选择时间帧作为元组

如何解决从时间点列表中随机选择时间帧作为元组

我从一个视频中提取了几个时间点,其中有一些最大时间长度 (T)。这些点存储在一个列表列表中,如下所示:

time_pt_nested_list = 
[[0.0,6.131,32.892,43.424,46.969,108.493,142.69,197.025,205.793,244.582,248.913,251.518,258.798,264.021,330.02,428.965],[11.066,35.73,64.784,151.31,289.03,306.285,328.7,408.274,413.64],[48.447,229.74,293.19,333.343,404.194,418.575],[66.37,242.16,356.96,424.967],[78.711,358.789,403.346],[84.454,373.593,422.384],[102.734,394.58],[158.534],[210.112],[247.61],[340.02],[365.146],[372.153]]

上面的每个列表都与一些概率相关;我想根据概率从每个列表中随机选择点以形成连续时间跨度的 n 元组,例如:

[(0,t1),(t1,t2),(t2,t3),...,(tn,T)]

其中 n用户指定。所有返回的元组应该只包含上面嵌套列表中的浮点数。我想为它们分配最高概率进行采样并出现在返回的元组中,第二个列表的概率稍低,等等。这些概率的确切细节并不重要,但如果用户可以输入一个就好了控制当 idx 增加时概率衰减的速度的参数。

返回的元组是应该完全覆盖整个视频并且不应该重叠的时间帧。 0T 可能不一定出现在 time_pt_nested_list 中(但它们可能)。有没有很好的方法来实现这一点?如果您有任何有见地的建议,我将不胜感激。

例如,如果用户输入 6 作为子剪辑的数量,那么这将是一个示例输出

[(0.0,32.892),(32.892,64.784),(64.784,229.74),(229.74,306.285),(306.285,418.575),(418.575,437.47)]

元组中出现的所有数字都出现在time_pt_nested_list中,除了0.0437.47。 (嗯,0.0 确实出现在这里,但在其他情况下可能不会)这里的 437.47 是视频的长度,它也给出,可能不会出现在列表中。

解决方法

这比看起来简单。你真的只需要从你的子列表中采样 n 点,每个点都有依赖于行的样本概率。无论获得什么样本,都可以按时间顺序构建元组。

import numpy as np

# user params
n = 6
prob_falloff_param = 0.2

lin_list = sorted([(idx,el) for idx,row in enumerate(time_pt_nested_list) for 
el in row],key=lambda x: x[1])

# endpoints required,excluded from random selection process
t0 = lin_list.pop(0)[1]
T = lin_list.pop(-1)[1]
arr = np.array(lin_list)

# define row weights,alpha is parameter
weights =  np.exp(-prob_falloff_param*arr[:,0]**2)
norm_weights = weights/np.sum(weights)

# choose (weighted) random points,create tuple list:
random_points = sorted(np.random.choice(arr[:,1],size=(n-1),replace=False))

time_arr = [t0,*random_points,T]
output = list(zip(time_arr,time_arr[1:]))

示例输出:

# n = 6 
[(0.0,78.711),(78.711,84.454),(84.454,158.534),(158.534,210.112),(210.112,372.153),(372.153,428.965)]

# n = 12
[(0.0,6.131),(6.131,43.424),(43.424,64.784),(64.784,102.734),(102.734,229.74),(229.74,244.582),(244.582,264.021),(264.021,424.967),(424.967,428.965)]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。