2016-11-05 103 views
0

我試圖在將它初始化爲零後,將值分配給python中的多維列表。 以下是edge_strength和initialProb是多維列表的代碼。python中二維列表中的值賦值不正確

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時,您不會得到三個不同的行,而是三個對同一個列表的引用。如果您修改列表,所有三個都會更改。

根據線程

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

也應該解決您的錯誤

+0

喔!初始化列表[[0] * 3在範圍(3)中的r]的解決方案確實解決了問題:)。謝謝 –