Сложить текущий элемент вектора с одним из предыдущих из этого же вектора

Есть два вектора:

streak = np.array([3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3], int)
arr    = np.array([4, 5, 5, 6, 9, 1, 4, 5, 2, 3, 7, 8, 9, 8, 4, 3], float)

Числа в streak всегда больше нуля.

Задача cложить текущий элемент вектора arr с одним из предыдущих из этого же вектора. Индекс предыдущего взять из вектора streak.

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

В результате должен получится вектор:

[nan nan nan 11. 14.  6.  9.  9.  6.  5.  9. 10. 11. 17. 13. 12.]

Ответы (2 шт):

Автор решения: nick
import numpy as np

streak = np.array([3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3], int)
arr    = np.array([4, 5, 5, 6, 9, 1, 4, 5, 2, 3, 7, 8, 9, 8, 4, 3], float)


def shift(arr, num):
    res = np.empty_like(arr)
    res[:num] = np.nan
    res[num:] = arr[:-num]

    return res


res = np.full_like(arr, np.nan)

for i in range(streak.size):
    arr_streak_shift = shift(arr, streak[i])

    print("{0} + {1}".format(arr_streak_shift[i], arr[i]))

    res[i] = arr_streak_shift[i] + arr[i]

print(res)
→ Ссылка
Автор решения: EzikBro
streak = [3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3]
arr    = [4, 5, 5, 6, 9, 1, 4, 5, 2, 3, 7, 8, 9, 8, 4, 3]

ans = [None] * len(arr)
for i in range(len(arr)):
    ind = i - streak[i]
    if ind >= 0:
        ans[i] = arr[i] + arr[ind]

print(*ans)

Для numpy-массивов переписать - дело пары минут. Я в вас верю

→ Ссылка