【问题标题】:Difference between large numpy arrays containing time values包含时间值的大型 numpy 数组之间的差异
【发布时间】:2014-05-28 16:46:10
【问题描述】:

我有十 (1000,1000) 个 numpy 数组。每个数组元素都包含一个浮点数,它代表一天中的小时。例如。 14.0 = 2pm 和 15.75 = 15:45pm。

我想找出这些数组之间的最大差异。结果应该是单个 (1000,1000) numpy 数组,其中每个数组元素包含十个数组之间的最大差异。目前我有以下,这似乎工作正常:

import numpy as np

max=np.maximum.reduce([data1,data2,data3,data4,data5]) 
min=np.minimum.reduce([data1,data2,data3,data4,data5])

diff=max-min

但是,它会导致晚上 11 点和凌晨 1 点之间的差异为 22 小时。我需要相差2小时。我想我需要以某种方式使用 datetime.time,但我不知道如何让 datetime 与 numpy 数组很好地配合。


编辑:时间是指一天中某个事件发生的平均时间,因此它们与特定日期无关。因此,两次差值可以正确解释为 22 小时或 2 小时。但是,我总是希望采取这两种可能的解释中的最低限度。

【问题讨论】:

  • 没有日期,你怎么知道晚上 11 点和凌晨 1 点之间的时差是 2 小时而不是 22 小时。您需要日期来解决歧义。如果是同一天,则为 22 小时;如果它们来自连续几天,则为 2 小时。
  • 你想要最小距离吗,因为你没有日子?就像您的示例状态一样,可能是 22 小时或 2 小时......
  • 时间与日期无关,它们只是指一天中某个事件发生的平均时间。因此,差异可以解释为 22 小时或 2 小时,但我始终希望采用这两种可能解释中的最小值。
  • 您是在寻找最大元素比较差异还是所有可能的数组 1 和 2 对之间的最大差异?
  • 我正在寻找最大的元素比较差异。

标签: python arrays numpy time python-datetime


【解决方案1】:

您可以通过在循环 (12.0) 中围绕中心位置将一个值居中来获取两个循环值之间的差异。将其他值旋转相同的量以保持它们的相对差异。将调整值的模数乘以循环的持续时间,以将所有内容保持在范围内。您现在可以调整时间,使最大可能距离保持在 +/- 1/2* 周期持续时间(+/-12 小时)内。

例如,

adjustment = arr1 - 12.0
arr2 = (arr2 - adjustment) % 24.0
diff = 12.0 - arr2 # or abs(12.0 - arr2) if you prefer

如果您不使用绝对值,则需要根据您希望被视为“第一”的时间来使用符号。

【讨论】:

    【解决方案2】:

    假设您有数字 11pm 和 1am,并且您想找到最小距离。

    1am -> 1
    11pm -> 23
    

    那么你有:

    23 - 1 = 22
    

    或者,

    24 - (23 - 1) % 24 = 2
    

    那么距离可以认为是:

    def dist(x,y):
        return min(abs(x - y), 24 - abs(x - y) % 24)
    

    现在我们需要将dist 应用到每个组合中,如果我没记错的话,还有一个更面向numpy/scipy 的函数可以做到这一点,但概念大致相同:

    from itertools import combinations
    
    data = [data1,data2,data3,data4,data5]
    combs = combinations(data,2)
    comb_list = list(combs)
    dists = [dist(x,y) for x,y in comb_list]
    max_dist = max(dists)
    

    【讨论】:

      【解决方案3】:

      如果您有一个数组 diff 的时差介于 0 到 24 小时之间,您可以对错误计算的值进行更正,如下所示:

      diff[diff > 12] = 24. - diff[diff > 12]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        • 2019-09-04
        • 2015-10-08
        • 1970-01-01
        相关资源
        最近更新 更多