我有一些每秒记录的数据并测量一些值,我可以绘制它的图形并查看分布的外观,但是如何找到具有最大总和或最大间隔的子数组如果所有值都是正值,那么值是什么?
如果图表是测量温度,例如我怎样才能找出当天最热的时间间隔是什么时间。临时图?(两者都是我程序中的数组)
答案 0 :(得分:1)
如果数组包含负数,则可以使用Kadane's Algorithm。但由于你的数组都是正整数,你可以自己做出解决方案。
一种方法是规范化数组,然后对值进行阈值处理。然后遍历数组,当您看到一个值超过阈值时,将该索引保存在数组中作为子数组的开头。当值回到阈值以下时,将该索引保存为子数组的末尾。
使用此解决方案,您可以拥有多个最热门的部件"当天这是有道理的,因为如果它在当天的两个不同地方爬到相同的温度怎么办?
如果您只想要一个子数组,那么在计算上述结果后,您可以选择具有最大总和的子数组(对子数组中的所有值求和)。
要规范化数组,首先要计算数组的平均值。然后从数组中的每个值中减去平均值。现在数组以零为中心。然后找到数组中的最大值。将数组中的每个值除以最大值。现在,数组中的最大值为1。标准化允许您准确地对数据进行阈值处理,而不管数组的最大值或平均值。
这里是python代码(x是输入数组作为numpy数组):
def getMaxSubArrays(x):
y=x-np.mean(x)
z=y/y.max()
maxSubArrays=[]
subFound=False
begin=0
for i in range(len(z)):
if z[i]>0.75 and subFound==False:
subFound=True
begin=i
elif z[i]<=0.75 and subFound==True:
subFound=False
maxSubArrays.append((begin,i))
for subarray in maxSubArrays:
print "subarray found: index ",subarray[0]," to ",subarray[1], x[subarray[0]:subarray[1]]
return maxSubArrays