gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:59:26 37 4
gpt4 key购买 nike

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

我有一片:

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

和一个重量 slice :

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]
}

但如您所见,我在 valueList 中得到了一个 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)

输出(在 Go Playground 上尝试):

Average: 357.1428571428571

注意:

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

注释 #2:

如果输入 slice 为空(通过 len == 0 或所有值为 0)或非零的 sumWeight值为 0.0,结果将为 NaN,因为除以 sumWeight,即 0.0。您可能想检查这种情况并做其他事情:

if sumWeight > 0.0 {
avg /= sumWeight
}

关于algorithm - 如何计算非零值的加权平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30480782/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com