我有 N 个不同长度的大型列表,其中列表中的每个值代表长度为 25 的固定窗口上的信号。即,我每 25 秒/基数/等取信号的平均值,并将该值存储在一个列表。
我为运行不同时间长度(所有 25 btw 的倍数)的不同实验/设备执行此操作。
即,list 1 是 1000 次运行,list1 中有 1000/25=40 个值,list 2 是 1025 分钟运行,list2 中有 1025/25 = 41 个值,list3 是 2525 次运行,2525/25 = 101 list3 中的值等...
现在,为了比较,我想将每个列表重新缩放到相同数量的箱,让我们说 40 个箱。
事实上,list1resized 的长度将是 40,并且它的值不会改变,因为 1000/40 = 25 正好。list2resized 将从 41 个值的长度变为 40 个值的长度,而 list3 将从 101 个值的长度变为 40 个值的长度(也就是所有列表现在都具有相同的大小)。
问题来了。如何通过在适当的 bin 上取加权平均值来将每个列表的大小调整为 40 的固定长度?
一个例子将澄清这个问题。
list1 = [4.8, 6.9, ...] #40 values for the 1000 run
list2 = [5.6, 7.8, 8.9, 13.4, ...] #41 values for the 1025 run
list3 = [4.1, 5.6, 10.3, 9.8, 40, 30, 21.4, 3, 2,...] #101 values for the 2525 run
现在,调整大小的列表应如下所示:
list1resized = [4.8*25/25, 6.9*25/25,...] #40 values for the 1000 run
list2resized = [(5.6*25+7.8*0.625)/25.625, (7.8*24.375+8.9*1.275)/25.625, (23.725*8.9+1.9*13.4)/25.625,...] # 40 values, averaged accordingly, for the 1025 run
list3resized = [(4.1*25+5.6*25+10.3*13.125)/(63.125), (10.3*11.875+9.8*25+40*25+30*1.25)/(63.125),...] # 40 values, averaged accordingly, for the 2525 run
为了获得调整后列表中每个元素的平均值,我们对新调整大小的 bin 进行加权平均(即,对于 list1,平均超过 1000/40=25,对于 list2,平均超过 1025/40=25.625,平均超过2525/40=63.125 for list3 等)。即,相同但使用我用于加权平均值的公式:
list1resized = [4.8*25/25, 6.9*25/25,...] #40 values for the 1000 run
list2resized = [(5.6*25+7.8*0.625)/25.625, (7.8*24.375+8.9*(25.65-24.375))/(25.625), (23.725*8.9+(25.625-23.725)*13.4)/(25.625),...] # 40 values, averaged accordingly, for the 1025 run
list3resized = [(4.1*25+5.6*25+10.3*13.125)/(63.125), (10.3*(25-13.125)+9.8*25+40*25+30*(63.125-25*3+13.125)))/(63.125),...] # 40 values, averaged accordingly, for the 2525 run
如您所见,它可能会变得混乱且难以处理,但我正在寻找一种 Python 风格、优雅且快速的解决方案。
我必须多次对许多列表执行此操作,因此考虑运行时间会很好。
不确定您是否有任何想法,但我们将不胜感激。
谢谢。