两个数组之间的逐元素加权平均

时间:2019-05-27 14:18:56

标签: python numpy

我有两个数字数组,我想在这些数组之间计算加权平均值,然后将其存储在新数组中。

我现在使用的解决方案是:

array_1 = [0,1,2,3,4]
array_2 = [2,3,4,5,6]

weight_1 = 0.5
weight_2 = 0.5

array_3 = np.zeros(array_1.shape)

for i in range(0, len(array_1)) : 
    array_3[i] = np.average(a=[array_1[i], array_2[i]], weights=[weight_1, weight_2])

print(array_3)
>> [1,2,3,4,5]

问题在于它并不是真正有效。我如何才能更有效地做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以zip两个迭代器,并将每个元素乘以相应的权重

array_1 = [0,1,2,3,4]
array_2 = [2,3,4,5,6]

weight_1 = 0.5
weight_2 = 0.5

#Zip both iterators and multiply weight with corresponding item
result = [ item1 * weight_1 + item2 * weight_2 for item1, item2 in zip(array_1, array_2)]
print(result)

输出将为

[1.0, 2.0, 3.0, 4.0, 5.0]

答案 1 :(得分:2)

鉴于您正在使用 NumPy ,您可以通过执行以下操作轻松将其向量化:

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_1*weight_1 + array_2*weight_2
# array([1., 2., 3., 4., 5.])

可以将其概括为多个数组和权重吗?

要获得更通用的答案,最好的方法是使用np.average,它既接受array_like的数组,又接受weights的数组:

np.average([array_1, array_2], weights=[weight_1, weight_2], axis=0)
# array([1., 2., 3., 4., 5.])

答案 2 :(得分:2)

只需使用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.])

以下是使用np.average的直接NumPy解决方案,其中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的速度稍快一些,但这种性能仅适用于小型数组。我敢肯定,对于大型阵列,矢量化解决方案将取代

Devesh的方法

%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)