【问题标题】:Average of pairs (values, weights) in numpynumpy 中对(值、权重)的平均值
【发布时间】:2020-07-17 10:09:33
【问题描述】:

假设我有array = [values, weights]形式的输入数据

arr1 = [np.array([1,2,3,4]), np.array([1,1,1,1])]
arr2 = [np.array([2,4,6,8]), np.array([2,2,2,2])]

以及我想构建成对的 values 和 weights 有序条目,然后计算平均值(我希望从下面的尝试中可以清楚地看出这一点)。

这是我想出的,但感觉有一种更清洁的方法可以实现结果:

listArrs = [arr1, arr2]

vals = np.array([c[0] for c in listArrs]).T
weights = np.array([c[1] for c in listArrs]).T

[np.average(v,weights=w) for v,w in zip(vals, weights)]

Out: [1.6666666666666667, 3.3333333333333335, 5.0, 6.666666666666667]

【问题讨论】:

  • 据我所知,看来您实际上在进行平均非常有效。
  • 您是否尝试计算 values 数组的加权平均值?还是两个数字的平均值[val, weight]?

标签: python numpy average weighted


【解决方案1】:

而不是列表理解迭代器和 zip,只需这样做 -

np.average(vals, weights=weights, axis=1)
array([1.66666667, 3.33333333, 5.        , 6.66666667])

Numpy 实现了出色的向量化和广播,因此在处理矩阵或张量时您很少需要迭代器。

这是一个没有任何迭代器的解决方案

listArrs = np.array([arr1, arr2])
vals = listArrs[:,0]  #Slice the values
weights = listArrs[:,1]   #Slice the weights
np.average(vals, weights=weights, axis=0)  #Apply a weighted np.average on 2 - 2d arrays
array([1.66666667, 3.33333333, 5.        , 6.66666667])

你推荐的一个班轮 -

np.average(listArrs[:,0], weights= listArrs[:,1], axis=0)

【讨论】:

  • 太好了,谢谢!那么也可以简写为:np.average(listArrs[:,0], weights=listArrs[:,1], axis=0)
猜你喜欢
  • 2015-07-15
  • 2015-09-29
  • 2018-04-21
  • 1970-01-01
  • 2018-03-10
  • 2016-02-06
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多