Разница между большими массивами numpy, содержащими значения времени

У меня есть десять (1000 1000) массивов numpy. Каждый элемент массива содержит число с плавающей запятой, которое представляет час дня. Например. 14.0 = 14:00 и 15:75 = 15: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

Однако это приводит к разнице между 23:00 и 01:00 в 22 часа. Мне нужна разница в 2 часа. Я предполагаю, что мне нужно как-то использовать datetime.time, но я не знаю, как заставить datetime хорошо играть с массивами numpy.


Редактировать: время относится к среднему времени дня, когда происходит определенное событие, поэтому они не связаны с конкретной датой. Таким образом, разницу в два раза можно правильно интерпретировать как 22 часа или 2 часа. Однако я всегда буду хотеть брать минимум из этих двух возможных интерпретаций.


person user2414506    schedule 28.05.2014    source источник
comment
Без даты, как вы узнаете, что разница во времени между 23:00 и 1:00 составляет 2 часа, а не 22 часа. Вам нужна дата, чтобы разрешить двусмысленность. Если это один и тот же день, это 22 часа; если они из последовательных дней, это 2 часа.   -  person Cory Kramer    schedule 28.05.2014
comment
Вы хотите, как минимальное расстояние, так как у вас нет дней? Как указано в вашем примере, это может быть 22 часа или 2 часа...   -  person Dair    schedule 28.05.2014
comment
Время не связано с датой, оно просто относится к среднему времени суток, когда происходит определенное событие. Таким образом, разницу можно интерпретировать как 22 часа или 2 часа, но я всегда буду брать минимум из этих двух возможных интерпретаций.   -  person user2414506    schedule 28.05.2014
comment
Вы ищете максимальную поэлементную разницу в сравнении или максимальную разницу между всеми возможными парами массивов 1 и 2?   -  person AMacK    schedule 28.05.2014
comment
Я ищу максимальную разницу в сравнении элементов.   -  person user2414506    schedule 28.05.2014


Ответы (3)


Вы можете получить разницу между двумя циклическими значениями, центрируя одно значение вокруг центрального положения в цикле (12.0). Поверните другие значения на ту же величину, чтобы сохранить их относительные различия. Возьмите модуль скорректированных значений по продолжительности цикла, чтобы все оставалось в пределах допустимого. Теперь вы скорректировали время таким образом, чтобы максимально возможное расстояние оставалось в пределах +/- 1/2*длительности цикла (+/-12 часов).

e.g.,

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

Если вы не используете абсолютное значение, вам нужно будет поиграть со знаком в зависимости от того, какое время вы хотите считать «первым».

person AMacK    schedule 28.05.2014

Допустим, у вас есть число 23:00 и 1:00, и вы хотите найти минимальное расстояние.

1am -> 1
11pm -> 23

Тогда у вас есть либо:

23 - 1 = 22

Or,

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)
person Dair    schedule 28.05.2014

Если у вас есть массив diff разницы во времени в диапазоне от 0 до 24 часов, вы можете исправить неправильно рассчитанные значения следующим образом:

diff[diff > 12] = 24. - diff[diff > 12]
person Community    schedule 18.07.2014