如何计算非零值的加权平均值?

时间:2015-05-27 11:11:20

标签: algorithm go average

我是Go的新手,我正在做以下事情:

我有一个片段:

valueList := []int16{500, 400, 0, 300}

和重量片:

weightList := []float64{0.1, 0.2, 0.3, 0.4}

现在我想这样做:

res := make([]float64, 4)
for i, value := range valueList {
    res[i] = float64(value) * weightList[i]
}

但正如您所看到的,我在0中获得了valueList,现在我想将权重平均为其他值,如果值不是0,那么在此示例中,它应该是:

500 * (0.1 + 0.3/3) + 400 * (0.2 + 0.3/3) + 300 * (0.4 + 0.3/3)

如果显示另一个0,请再次平均重量。

我怎么能这么做呢?

1 个答案:

答案 0 :(得分:3)

您可以在迭代它们的同时计算非零值的总和权重,并在末尾用总和权重进行除法:

vs := []int{500, 400, 0, 300}
ws := []float64{0.1, 0.2, 0.3, 0.4}

sumWeight, avg := 0.0, 0.0
for i, v := range vs {
    if v == 0 {
        continue
    }
    sumWeight += ws[i]
    avg += float64(v) * ws[i]
}
avg /= sumWeight

fmt.Println("Average:", avg)

输出(在Go Playground上尝试):

Average: 357.1428571428571

注意:

此解决方案不要求权重总计1.0,也不要在0..1的范围内(但它们不能为负数)。

注意#2:

如果输入切片为空(通过len == 0或所有值为0)或sumWeight非零值为0.0,则结果为NaNsumWeight除以0.0而被if sumWeight > 0.0 { avg /= sumWeight } 。您可能需要检查此案例并执行其他操作:

find()