我对python中的列表有疑问。目前,我有一些看起来像这样的代码:
muaverage = (w[0] * mu[0] + w[1] * mu[1])
其中w和mu都是包含2个变量的列表。 虽然w和mu仅包含两个变量,但是代码可以正常工作,但是我想向这些列表添加更多的值,为此目的,遍历列表以查找总和似乎是最合适的。我尝试了以下
for i in range(0,len(mu)):
muaverage = sum(w[i] * mu[i])
,但这一直显示错误。任何建议将不胜感激!
答案 0 :(得分:5)
您的代码有两个问题:
muaverage
的先前值sum
相反,您可以 使用常规的for
循环:
muaverage = 0 # initialize before the loop
for i in range(0,len(mu)):
muaverage += w[i] * mu[i] # add to current value with +=
或在生成器表达式中使用sum
:
muaverage = sum(w[i] * mu[i] for i in range(len(mu)))
或将sum
和zip
设为suggested by @yatu:
muaverage = sum(x * y for x, y in zip(w, mu))
但是请注意,muaverage
并不是一个平均值。为此,您仍然需要将其除以元素数量或w
中的权重之和(?)以获得加权平均值。
答案 1 :(得分:1)
您似乎在mu
和w
之间使用(内)点积。
要自己实现,只需参考@tobias_k答案。但是,在Python中用于数字数组的标准包(即NumPy)中,函数dot()
或运算符@
(在Python> = 3.5中)将满足您的要求,即(内部)点产品。
import numpy as np
# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))
muaverage = sum(x * y for x, y in zip(mu, w))
# muaverage == 735
muaverage = np.dot(mu, w)
# muaverage == 735
# operands of `@` should be `numpy.array()`
mu = np.array(mu)
w = np.array(w)
muaverage = mu @ w
# muaverage == 735
但是您的命名暗示您可能在加权平均之后,您可能会使用average()
来接受weight
参数,例如
import numpy as np
# define some dummy objects
mu = list(range(0, 10))
w = list(range(10, 20))
muaverage = np.average(mu, weights=w)
# muaverage == 5.068965517241379
muaverage = np.dot(mu, w) / np.sum(w)
# muaverage == 5.068965517241379
(已编辑,以便更好地包含np.dot()
)。