4

反復プロセスによって作成されたリストがあり、可変数のサブリストで構成されており、すべて同じ数の要素があります。これも可変です。たとえば、1 回の反復で、次のように、それぞれ 3 つの要素からなる 4 つのサブリストを作成できます。

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

つまり、それぞれ 5 つの要素を持つ 3 つのサブリストです。

特定の反復では、すべてのサブリストは常に同じ数の要素を持ちます。

各サブリストの同じ位置にあるすべての要素の平均を含む、から新しいリストを繰り返し生成する方法が必要iです。したがって、最初のケースでは、次のよう になります。list_ilist_1

avrg_list = [4.0, 4.25, 5.75]

および の 2 番目のケースではlist_2:

avrg_list = [1.67, 5.67, 7.67, 2.33, 4.67]

さまざまな数のサブリストと要素に合わせて調整する柔軟なコードでこれを行うにはどうすればよいですか?

4

2 に答える 2

5

numpy の使用に興味がありますか?

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])
于 2013-08-30T16:42:08.650 に答える
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]

ドキュメントから:

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
于 2013-08-30T16:40:06.060 に答える