我有一个列表,由迭代过程创建,由可变数量的子列表组成,所有子列表都具有相同数量的元素;这也是可变的。例如,在一次迭代中,我可以有4个子元素,每个子元素包含3个元素,如下所示:
list_1 = [[1,3,5], [7,4,9], [3,6,2], [5,4,7]]
并且在代码的下一次迭代中我可以:
list_2 = [[2,4,8,3,5], [2,4,9,1,3], [1,9,6,3,6]]
即3个子元素,每个元素包含5个元素。
对于给定的迭代,所有子列表将始终具有相同数量的元素。
我需要一种从i
生成迭代list_i
新列表的方法,其中包含位于每个子列表中相同位置的所有元素的平均值。所以在list_1
的第一种情况下,我会得到:
avrg_list = [4.0, 4.25, 5.75]
和list_2
的第二种情况:
avrg_list = [1.67, 5.67, 7.67, 2.33, 4.67]
如何使用灵活的代码将其自身调整为不同数量的子列表和元素?
答案 0 :(得分:5)
In [19]: list_1 = [[1,3,5], [7,4,9], [3,6,2], [5,4,7]]
In [22]: np.mean(list_1, 0)
Out[22]: array([ 4. , 4.25, 5.75])
答案 1 :(得分:4)
将zip
与*
:
>>> [sum(x)/float(len(x)) for x in zip(*list_1)]
[4.0, 4.25, 5.75]
>>> [sum(x)/float(len(x)) for x in zip(*list_2)]
[1.6666666666666667, 5.666666666666667, 7.666666666666667, 2.3333333333333335, 4.666666666666667]
来自docs:
zip()
与*
运算符一起用于解压缩列表。
>>> zip(*list_1)
[(1, 7, 3, 5), (3, 4, 6, 4), (5, 9, 2, 7)]
时间比较:
>>> from itertools import izip
>>> import numpy as np
>>> lis = list_1*1000
>>> arr = np.array(lis)
>>> %timeit np.mean(lis, 0)
10 loops, best of 3: 31.9 ms per loop
>>> %timeit np.mean(arr, 0)
1000 loops, best of 3: 221 us per loop #clear winner
>>> %timeit [sum(x)/float(len(x)) for x in zip(*lis)]
100 loops, best of 3: 826 us per loop
#itertools.izip is memory efficient.
>>> %timeit [sum(x)/float(len(x)) for x in izip(*lis)]
100 loops, best of 3: 881 us per loop