大numpy数组中时间值的区别

0 投票
3 回答
502 浏览
提问于 2025-04-18 07:51

我有十个大小为(1000,1000)的numpy数组。每个数组里的元素都是一个浮点数,表示一天中的小时。例如,14.0代表下午2点,15.75代表下午3点45分。

我想找出这些数组之间的最大差值。结果应该是一个同样大小为(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小时。不过,我总是希望取这两种解释中的最小值。

3 个回答

0

如果你有一个数组 diff,里面存的是时间差,范围在0到24小时之间,你可以用下面的方法来修正那些计算错误的值:

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

假设你有两个时间,11点晚上和1点早上,你想找出它们之间的最小距离。

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)
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

如果你不使用绝对值,那么你需要根据你想要被视为“第一个”的时间来调整符号。

撰写回答