Чередование пар одномерных массивов в порядке сортировки в Python
У меня есть данные о времени и значениях из двух отдельных наборов данных, и я хотел бы чередовать их на основе временной части данных.
Я написал некоторый наивный код, который делает это так, как я ожидал (выбирая со второго, когда временные данные равны), но я уверен, что есть функция numpy или аналогичная, которая делает это эффективно / векторизованным способом. К сожалению, ни один из других ответов на чередование массивов не имеет этого ограничения, он всегда либо любой другой, либо максимум среди двух, либо похожий.
Вот функция:
def interleave_by_time(times_a, values_a, times_b, values_b):
size_a = np.size(times_a)
size_b = np.size(times_b)
assert size_a == np.size(values_a)
assert size_b == np.size(values_b)
idx_a = 0
idx_b = 0
while True:
skip_a = False
skip_b = False
try:
time_a = times_a[idx_a]
except IndexError:
skip_a = True
try:
time_b = times_b[idx_b]
except IndexError:
skip_b = True
if skip_a and skip_b:
break
if skip_a:
yield time_b, values_b[idx_b]
idx_b += 1
continue
if skip_b:
yield time_a, values_a[idx_a]
idx_a += 1
continue
if time_a < time_b:
yield time_a, values_a[idx_a]
idx_a += 1
else:
yield time_b, values_b[idx_b]
idx_b += 1
В интерпретаторе он используется так:
>>> t1 = [1,3,5,7,9]
>>> v1 = [101,103,105,107,109]
>>> t2 = [2,4,6,8]
>>> v2 = [102,104,106,108]
>>> it = interleave_by_time(t1, v1, t2, v2)
>>> for t, v in it:
... print(t, v)
1 101
2 102
3 103
4 104
5 105
6 106
7 107
8 108
9 109
Возможно, это можно решить аналогичным образом, как здесь: вопрос: чередование двух массивов индексных индексов, по одному элементу из каждого массива, но я не уверен, как это будет сделано.