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

标签 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]

问题是它不是很有效。我怎样才能更有效地做到这一点?

最佳答案

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

关于python - 两个数组之间的加权平均元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56327842/

相关文章:

python - AWS Lambda 代码无法从 S3 导入依赖项 -- Runtime.ImportModuleError

Numpy 和删除具有相同值的行的最佳方法

python - 使用 Numba 提取 numpy 数组中的特定行

python - 如何将 numpy 数组转换为形式 ((value0, row0, column0), (value1, row0, column1)...)?

python - 在 Python 3.6 中,为什么在 numpy 数组中负数的分数次方会返回 nan?

python - 如何在父子关系上组合两个数据帧(介于连接和合并之间)

python错误代码处理

python - 更改嵌套菜单中的图标

python - 在 Django 中在哪里实现 python 类?

python - 多维切片数组Python