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
}