Создание новых массивов на основе различия предыдущих и последующих элементов двух других массивов - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть некоторые события с шагами времени начала и окончания. Массив «start» представляет начальные временные шаги для 4 событий, массив «end» представляет конечные временные шаги для этих событий, а массив «prop» содержит одно числовое свойство для каждого события (например, 2-е событие (1 индекс), начатое во время шаг 12 и закончен на этапе 14 времени, и его свойство равно 20). Массив «diff» показывает разницу между событиями (от конца предыдущего события до начала следующего). Разница во времени между окончанием 1-го события и началом 2-го события составляет 7 шагов. Массив «diff» меньше других массивов («start», «end», «prop») на 1 элемент.

import numpy as np

start=np.array([3,12,16,30])
end = np.array([5,14,18,32])
prop=np.array([10,20,10,30])

diff=np.zeros(len(start)-1)

for i in range(1,len(start)):
    diff[i-1] = start[i] - end[i-1]

print('diff',diff)

diff [ 7.  2. 12.]

События, которые близки по времени, должны объединяться. Если разница между двумя соседними событиями меньше 3-х шагов, их необходимо объединить. Например, 2-е и 3-е события отличаются на 2 временных шага, поэтому они сливаются в новое событие, начало которого - временной шаг: 12, а его конечный временной шаг - 18). Что касается массива «prop», то необходимо сохранить максимум prop[i] между объединенными событиями (prop[1] >prop[2]), поэтому 20 будет назначено новому объединенному событию (merged_prop[1]=20). Я хотел бы иметь 3 новых массива с характеристиками всех событий (слитых и не слитых), таких как:

merged_start=np.array([3,12,30])
merged_end = np.array([5,18,32])  #2nd and 3rd event have been merged
merged_prop=np.array([10,20,30])

Я также приложил еще один более крупный пример, чтобы более четко понять, чего я хочу. 2-е и 3-е события слились в одно большое событие, также как и 4-е до (включительно) 7-го.

start_2=np.array([3,12,16,38,42,46,50,60])
end_2=  np.array([5,14,32,40,44,48,54,70])
prop_2= np.array([10,8,20,10,35,10,10,10])

diff_2=np.zeros(len(start_2)-1)

for i in range(1,len(start_2)):
    diff_2[i-1] = start_2[i] - end_2[i-1]

print('diff_2',diff_2)

diff_2 [7. 2. 6. 2. 2. 2. 6.]
#Desirable outputs
merged_start_2=np.array([3,12,38,60])
merged_end_2 = np.array([5,32,54,70])
merged_prop_2= np.array([10,20,35,10])

Другой пример

start_3 = np.array([ 3, 12, 18, 38, 42, 46, 50, 60])
end_3  = np.array([ 5, 14, 32, 40, 44, 48, 54, 70])
prop_3  = np.array([10,  8, 20, 10, 35, 10, 10, 10])

#Desirable outputs
merged_start_3=np.array([3,12,18,38,60])
merged_end_3 = np.array([5,14,32,54,70])
merged_prop_3= np.array([10,8,20,35,10])

Как я могу это сделать? Я могу извлечь индексы из массивов "diff", "diff_2", значения которых меньше 3, но я не знаю, как продолжить.

1 Ответ

2 голосов
/ 08 апреля 2020

Вот способ, которым вы можете сделать это:

import numpy as np

MERGE_THRESHOLD = 3

start = np.array([ 3, 12, 16, 38, 42, 46, 50, 60])
end   = np.array([ 5, 14, 32, 40, 44, 48, 54, 70])
prop  = np.array([10,  8, 20, 10, 35, 10, 10, 10])

# Gap between events
dists = start[1:] - end[:-1]
# Mask events to merge
m = dists >= MERGE_THRESHOLD
# Find first and last indices of each merged group
first_indices = np.flatnonzero(np.r_[True, m])
last_indices = np.r_[first_indices[1:], len(start)] - 1
# Make results
merged_start    = start[first_indices]
merged_end      = end[last_indices]
merged_prop_max = np.maximum.reduceat(prop, first_indices)
merged_prop_sum = np.add.reduceat(prop, first_indices)
elems_per_merge = last_indices - first_indices + 1
merged_prop_avg = merged_prop_sum / elems_per_merge

print(merged_start)
# [ 3 12 38 60]
print(merged_end)
# [ 5 32 54 70]
print(merged_prop_max)
# [10 20 35 10]
print(merged_prop_sum)
# [10 28 65 10]
print(merged_prop_avg)
# [10.   14.   16.25 10.  ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...