【问题标题】:How to find maximum interval in a graph?如何在图中找到最大间隔?
【发布时间】:2015-02-13 16:17:11
【问题描述】:

我有一些每秒记录的数据并测量一些值,我可以绘制它的图表并查看分布情况,但是如何找到具有最大总和的子数组或具有最大的间隔如果所有值都是正数,则值?

如果图表正在测量温度,例如,我将如何找出一天中的哪个时间间隔是从某个时间到最热的时间?临时图?(这两个都是我程序中的数组)

【问题讨论】:

  • 你能更精确一点吗?如果所有条目都是正数,则“总和最大的子数组”将始终是整个数组。
  • 这听起来不像是一个 Python 问题(这只是实现语言),而更像是一个 CS 问题。没有专门的堆栈交换站点吗?
  • " 听起来不像是一个 python 问题" 忘了说我正在使用 matplotlib 并且安装了 numpy 以防万一使用这些库有更简单的方法。
  • “你能更精确点吗?”如果所有条目都是正数,“总和最大的子数组”将始终是整个数组。“这正是我问这个问题的原因,那里如果数组同时具有正数和负数但我的数据都是正数,那么算法会这样做。

标签: python arrays math graph


【解决方案1】:

如果数组包含负数,您可以使用Kadane's Algorithm。但由于你的数组都是正整数,你可以自己解决。

一种方法是对数组进行规范化,然后设置阈值。然后遍历数组,当你看到一个值超过阈值时,将该索引保存在数组中作为子数组的开头。当值回到阈值以下时,将该索引保存为子数组的末尾。

使用此解决方案,您可以在一天中拥有多个“最热门的部分”。这是有道理的,因为如果它在一天中的两个不同时间段攀升到相同的温度会怎样?

如果您只想要一个子数组作为结果,那么在计算上述结果之后,您可以选择总和最大的子数组(将子数组中的所有值相加)。

要对数组进行归一化,首先要计算数组的均值。然后从数组中的每个值中减去平均值。现在数组以零为中心。然后找到数组中的最大值。将数组中的每个值除以最大值。现在数组中的最大值是一。归一化允许您准确地对数据进行阈值处理,而不管数组的最大值或平均值。

这是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

【讨论】:

  • 老兄太棒了,但你给了我另一个想法:我只是对数组进行了归一化,并使用了典型的涉及负数和正数的最大子数组解决方案,它奏效了。
  • @Toshiro 我刚刚意识到我发布的解决方案还可以在一天中找到多个最热点,它可以让您通过选择自己的阈值来定义自己对炎热天气的定义。所以我发布了代码以防万一它对你有用
  • @Toshiro 之前坏了,刚刚修好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多