2012-10-31 49 views
18

python中沒有數組類型,但爲了模擬它,我們可以使用列表。我想要用零填充2d類似於數組的結構。我的問題是:有什麼區別,如果有的話,在這兩個表達式:二維零數組

zeros = [[0 for i in xrange(M)] for j in xrange(M)] 

zeros = [[0]*M]*N 

zeros是一樣的嗎?哪一個更適合使用速度和可讀性?

回答

28

您應該使用numpy.zeros。如果這不是一個選項,你需要第一個版本。在第二個版本,如果你改變一個值,它會在其他地方的清單改變 - 例如:

>>> a = [[0]*10]*10 
>>> a 
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 
>>> a[0][0] = 1 
>>> a 
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

這是因爲(當你閱讀由內而外的表達式),創建列表10個零。然後,您創建10個引用列表,包含10個零的初始列表。


需要注意的是:

zeros = [ [0]*M for _ in xrange(N) ] 

也將工作,它避免了嵌套列表理解。如果numpy不在桌面上,這是我將使用的表單。

+0

是否真的必要簡單地使用numpy的該單一特徵的M×N陣列?第一版+1。 – John

+1

@johnthexiii - 可能不是。但是,如果OP想要一個二維數組的零,我會願意出去走走,並說OP的代碼也可能從其他地方的numpy中受益。 – mgilson

+0

我不會安裝numpy只是爲了清零;)感謝以後的解釋,這正是我一直在尋找的。 – yakxxx

2

在第二種情況下,你創建的同一列表的引用列表。如果你有這樣的代碼: [LST] * N,其中LST是一個列表的引用,您將有以下列表: [LST,善堂,善堂,善堂,...,LST]。但是因爲結果列表包含對同一對象的引用,所以如果在一行中更改值,則將在其他所有行中更改。

7

用於Python 3(沒有更多的xrange),優選的答案

zeros = [ [0] * N for _ in range(M)] 

爲零