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

Algorithm 如何计算非零值的加权平均值?,algorithm,go,average,Algorithm,Go,Average,我是新手,我正在做以下工作: 我有一片: 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 := []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
,现在我想平均其他值的权重,如果值不是
0
,那么在本例中,它应该是:

500 * (0.1 + 0.3/3) + 400 * (0.2 + 0.3/3) + 300 * (0.4 + 0.3/3)
如果出现另一个
0
,则再次平均重量


如何简单地做到这一点?

您可以在对非零值进行迭代时计算它们的总权重,并在最后除以总权重:

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)
输出(在上尝试):

注意:

此解决方案不要求权重总和为
1.0
,也不要求权重范围为
0..1
(但它们不能为负值)

注意#2:

如果输入片为空(通过使
len==0
或所有值均为
0
)或非零值的
sumWeight
0.0
,由于除以
sumWeight
,结果将为
NaN
。您可能需要检查此案例并执行其他操作:

if sumWeight > 0.0 {
    avg /= sumWeight
}

[]int16
片或数组中不能有
nil
值。这就是编译时错误。在发布问题之前,您应该先尝试一下示例代码。@icza…,那么我怎么能有类似的东西呢?我是刚来戈朗的
if sumWeight > 0.0 {
    avg /= sumWeight
}