Python中如何对列表对象的attributions属性逐元素求平均?
逐元素求二维列表均值的最优方法
这个问题我碰到过好几次,刚好可以给你梳理下最优的解决思路~首先得澄清一个点:如果你的attributions是普通Python列表的话,直接用sum(a.attribution for a in attrs)其实是错误的——因为Python内置的sum对列表做的是拼接操作,比如你例子里的两个列表会被拼成[[2,1],[4,6],[4,3],[8,8]],根本不是元素级相加。如果你的现有代码能得到正确结果,大概率是attributions是numpy数组(numpy的sum支持元素级运算)。
下面分两种场景给你最优方案:
场景1:可以使用numpy(推荐,尤其是数据量大时)
numpy对多维数组的均值计算做了高度优化,代码简洁且效率拉满:
import numpy as np # 先提取所有对象的attributions属性 all_attrs = [obj.attributions for obj in attrs] # 沿第0轴(也就是对象维度)逐元素求平均,再转回列表格式 mean_attrs = np.mean(all_attrs, axis=0).tolist()
比如你的例子里,np.mean会自动把两个二维数组对应位置的元素相加后除以2,直接得到你要的[[3,2],[6,7]]。
场景2:纯Python实现(无第三方库依赖)
如果不能用numpy,用zip(*...)来分组对应位置的元素是最清晰高效的纯Python写法:
all_attrs = [obj.attributions for obj in attrs] count = len(all_attrs) # 嵌套zip实现逐元素分组求和 mean_attrs = [ [sum(col_values) / count for col_values in zip(*row_group)] for row_group in zip(*all_attrs) ]
代码逻辑拆解:
zip(*all_attrs)会把每个对象的第1行、第2行...分别打包成组——你的例子里会得到([[2,1], [4,3]], [[4,6], [8,8]])- 对每个行组(比如第一个行组
[[2,1], [4,3]]),再用zip(*row_group)把同一列的元素打包,得到(2,4)和(1,3) - 对每个列的元素求和后除以对象数量,就得到对应位置的均值
关于你现有方法的补充
如果你的attributions已经是numpy数组,那sum(a.attribution for a in attrs)/len(attrs)是可行的,但不如np.mean简洁——np.mean内部已经做了求和+除以数量的操作,而且处理边缘情况(比如空列表)更稳妥。
内容的提问来源于stack exchange,提问作者dfrey
相关产品推荐
相关产品推荐

