Чередование пар одномерных массивов в порядке сортировки в 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

Возможно, это можно решить аналогичным образом, как здесь: вопрос: чередование двух массивов индексных индексов, по одному элементу из каждого массива, но я не уверен, как это будет сделано.

0 ответов

Другие вопросы по тегам