2017-02-09 10 views
1

配列内の各リストの合計を取得する2D配列を反復しようとしています。例えば、私が持っている:Python 2D配列の合計の列挙

test = [[5, 3, 6], [2, 1, 3], [1, 1, 3], [2, 6, 6], [4, 5, 3], [3, 6, 2], [5, 5, 2], [4, 4, 4], [3, 5, 3], [1, 3, 4]] 

私は例5 + 3 + 6と2 + 1 + 3のために、新たな配列にそれらを置くので、それぞれの小さな配列の値を取ることにしたいです。だから私は次のようなものを目指しています:

testSum = [14, 6, 5, 14...]. 

2次元配列を正しく列挙することに問題があります。それは周りにジャンプするようです。私は正しくない、私のコードを知っているが、これは私がこれまで持っているものです。

k = 10 
m = 3 
testSum = [] 

#create array with 10 arrays of length 3 
test = [[numpy.random.randint(1,7) for i in range(m)] for j in range(k)] 
    sum = 0 
    #go through each sub-array in test array 
    for array in test: 
    #add sums of sub-arrays 
     for i in array 
      sum += test[array][i] 
     testSum.append(sum) 
+2

おそらく - リスト(マップ(合計、テスト)) –

答えて

2

あなたが使用しているので、 Numpyは、Numpyにループ処理をさせるべきです。は、明示的なPythonループを使用するより効率的です。あなたが投稿したコードについては

import numpy as np 

k = 10 
m = 3 

test = np.random.randint(1, 7, size=(k, m)) 
print(test) 
print('- ' * 20) 

testSum = np.sum(test, axis=1) 
print(testSum) 

典型的な出力

[[2 5 1] 
[1 5 5] 
[6 5 3] 
[1 1 1] 
[2 5 6] 
[4 2 5] 
[3 3 1] 
[6 4 6] 
[2 5 1] 
[6 5 2]] 
- - - - - - - - - - - - - - - - - - - - 
[ 8 11 14 3 13 11 7 16 8 13] 

、それはいくつかの問題があります。主なものは、サブリストごとにsum変数をゼロに設定する必要があるということです。ところで、sumを変数名として使用しないでください。なぜなら、Pythonに組み込まれているsum関数を隠すからです。

また、配列アクセスが間違っています。 (また、標準モジュールの名前なので、arrayを変数名として使用しないでください)。これらのリストのそれぞれにおける

test内の各リストの上に
for array in test: 
    for i in array: 

繰り返し処理し、各項目の上

sum += test[array][i] 

にインデックスを作成しようとしているので、そうiは、すでに内側のリストの項目ですtestリストで整数の代わりにリストを表示し、その結果を現在のアイテムでインデックス化しようとしています(i)。

(あなたは、ループ変数がコンテナ内のアイテムではなく、それらの指標の値を取るforループにおいてコンテナオブジェクトを反復換言すれば、Pythonで、これはあなたから来ている場合に混乱することができますループ変数がそれらの項目のインデックスを取得する言語です。インデックスが必要な場合は、組み込みのenumerate関数を使用して、インデックスと項目を同時に取得できます。

修正されたバージョンのコードです。

import numpy as np 

k = 10 
m = 3 

#create array with 10 arrays of length 3 
test = [[np.random.randint(1,7) for i in range(m)] for j in range(k)] 
print(test) 
print() 

testSum = [] 
#go through each sub-array in test array 
for array in test: 
    #add sums of sub-arrays 
    asum = 0 
    for i in array: 
     asum += i 
    testSum.append(asum) 

print(testSum) 

典型的な出力

[[4, 5, 1], [3, 6, 6], [3, 4, 1], [2, 1, 1], [1, 6, 4], [3, 4, 4], [3, 2, 6], [6, 3, 2], [1, 3, 5], [5, 3, 3]] 

[10, 15, 8, 4, 11, 11, 11, 11, 9, 11] 

私が先に言ったように、それがnumpyの配列を使用してnumpyのは、あなたのためのループをやらせるためにはるかに良いです。しかし、あなたのプログラムが小さなリストしか処理していない場合は、Numpyを使う必要はありません。標準のrandomモジュールの関数を使って乱数を生成し、Rahul KPの答えを使って和を計算します。 Pythonループを使用するよりも速くなります。

+0

あなたのclariifficationには本当にありがとう!私は、総称してPythonの機能に組み込まれていたとは思わなかった。 Javaから来て、Pythonでインデックスを作成するのはちょっと混乱しますが、あなたはそれをもっとはっきりさせました。再度、感謝します! – helloworld

3

あなたはこれより多くの神託の方法を行うことができ、

In [17]: print [sum(i) for i in test] 
[14, 6, 5, 14, 12, 11, 12, 12, 11, 8] 

または

In [19]: print map(sum,test) 
[14, 6, 5, 14, 12, 11, 12, 12, 11, 8]