Skip to main content
 首页 » 编程设计

python之numpy 中列表列表的平均值

2025年05月04日14mfryf

我有一个循环,可以获取列表的列表:

for i in range(num_exp): 
  li = func() 

其中 li 是表单列表的列表 [["s1", 1, 2], ["s2", 2, 3], ["s3", 3, 4]] (第一项是字符串,其余 2 项是数字)

我想对循环中每个 li 的数值取平均值。 所以对于 num_exp = 3 和 li 的

[["s1", 1, 2], ["s2", 3, 4], ["s3", 5, 6]] 
[["s1", 2, 3], ["s2", 4, 5], ["s3", 6, 7]] 
[["s1", 3, 4], ["s2", 5, 6], ["s3", 7, 8]] 

我会得到

[["s1", 6/3, 9/3], ["s2", 12/3, 15/3], ["s3", 18/3, 21/3]] 

我想用 numpy 来做。在简单的 python 中我做如下

 dic = {} 
 for l in li: 
     if l[0] not in dic: 
        dic[l[0]] = l[1:] 
      else: 
        dic[l[0]][0] += l[1]  
        dic[l[0]][1] += l[2]  
 
 fl = [] 
 for m in dic: 
    fl.append([m, dic[m][0]/num_exp, dic[m[1]/num_exp]) 

但是看起来效率很低

请您参考如下方法:

从列表 li 的列表创建 np.array 指定 dtype='object' 和 swapaxes 到组相同的 s 到同一组。将轴 2(最右侧的轴)上的最后 2 个元素切片,sum,然后除以 num_exp。最后,column_stack 唯一的字符串值给它。

num_exp = 3 
li = [[["s1", 1, 2], ["s2", 3, 4], ["s3", 5, 6]], 
      [["s1", 2, 3], ["s2", 4, 5], ["s3", 6, 7]], 
      [["s1", 3, 4], ["s2", 5, 6], ["s3", 7, 8]]] 
 
arr = np.array(li, dtype='object').swapaxes(0, 1) 
 
Out[372]: 
array([[['s1', 1, 2], 
        ['s1', 2, 3], 
        ['s1', 3, 4]], 
 
       [['s2', 3, 4], 
        ['s2', 4, 5], 
        ['s2', 5, 6]], 
 
       [['s3', 5, 6], 
        ['s3', 6, 7], 
        ['s3', 7, 8]]], dtype=object) 
 
arr1 = arr[...,[1,2]].sum(axis=1) / num_exp 
 
Out[380]: 
array([[2.0, 3.0], 
       [4.0, 5.0], 
       [6.0, 7.0]], dtype=object) 
 
s = arr[:,0, 0] 
result = np.column_stack([s, arr1]) 
 
Out[389]: 
array([['s1', 2.0, 3.0], 
       ['s2', 4.0, 5.0], 
       ['s3', 6.0, 7.0]], dtype=object)