Сложить текущий элемент вектора с одним из предыдущих из этого же вектора
Есть два вектора:
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-массивов переписать - дело пары минут. Я в вас верю