2016-11-05 19 views
0

最初にゼロに初期化した後、多次元リストに値を代入しようとしました。 以下は、edge_strengthとinitialProbがmultiDリストであるコードです。Pythonの2Dリストの値の割り当てが正しくありません

edge_strength = [[1,2,3],[3,4,5],[6,7,8]] 
    initialProb = [[0]*3]*3 
    initialColumn =1 
    denominator = 10 
    for r in range(0,3): 
     initialProb[r][initialColumn] = float(edge_strength[r][initialColumn])/denominator 
    print initialProb 

しかし、私は終了しinitialProbリストを印刷したとき、私は答えました - [[0、0.7、0]、[0、0.7、0]、[0、0.7、0]] 代わりに、それがなければなりませんされた - [[0、0.2、0]、[0、0.4、0]、[0、0.7、0]]。

誰も私にこの奇妙な動作と回避策を説明できますか?

答えて

0

なぜソリューションが動作しないのかわかりません。 initialProb [r] [initialColumn]はスカラーですが、edge_strength [r] [initialColumn]がブロードキャストされているようです。あなたが代わりに書き込んだ場合、私は何か似たものを期待します。

initialProb[1] = float(edge_strength[r][initialColumn])/denominator 

しかし、これは意味がありません。

numpyを使用した場合の回避策は次のとおりです。 numpy配列には利点があり、複数の列を同時に扱うことができます。私はそれが少なくとも助けてくれることを望む。

import numpy as np 
initialProb = np.zeros((3,3)) 
edge_strength = np.array([[1,2,3],[3,4,5],[6,7,8]]) 
initialProb[:,initialColumn] = edge_strength[:,initialColumn].astype(np.float)/denominator 

編集:何が起こっているのか理解しました。 Python list multiplication: [[...]]*3 makes 3 lists which mirror each other when modifiedを参照initialProbを初期化すると、3つの異なる行はなく、同じリストへの3つの参照が得られます。リストを変更すると、3つすべてが変更されます。スレッドによると

initialProb = [ [0]*3 for r in range(3) ] 

はまたあなたのエラー

+0

おお解決する必要があります!範囲(3)のrについてリスト[[0] * 3)を初期化する解決策は、問題を解決しました:)ありがとう –

関連する問題