Просто используйте векторизованные операции NumPy. Для этого сначала преобразуйте свои списки в массивы, а затем просто умножьте каждый массив на соответствующий вес и возьмите сумму
import numpy as np
array_1 = np.array([0,1,2,3,4])
array_2 = np.array([2,3,4,5,6])
weight_1 = 0.5
weight_2 = 0.5
array_3 = weight_1*array_1 + weight_2*array_2
# array([1., 2., 3., 4., 5.])
Прямое решение NumPy, использующее np.average
, будет следующим, где axis=0
означает взять среднее значение по строке (используя оба столбца). np.vstack()
просто складывает два массива по вертикали.
np.average(np.vstack((array_1, array_2)), axis=0, weights=[weight_1, weight_2])
Как указал @yatu, вы также можете передать список ваших массивов и указать ось
np.average([array_1, array_2], axis=0, weights=[weight_1, weight_2])
Сравнение времени, вдохновленное комментариями к ответу @ yatu : Как вы можете видеть, понимание списка и zip здесь немного быстрее, но тогда это представление для небольших массивов. Я уверен, что для больших массивов векторизованное решение займет
метод Девеша
%timeit result = [ item1 * weight_1 + item2 * weight_2 for item1, item2 in zip(array_1, array_2)]
# 25.5 µs ± 3.75 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.average([array_1, array_2], axis=0, weights=[weight_1, weight_2])
# 42.9 µs ± 2.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.average(np.vstack((array_1, array_2)), axis=0, weights=[weight_1, weight_2])
# 44.8 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)