python中沒有數組類型,但爲了模擬它,我們可以使用列表。我想要用零填充2d類似於數組的結構。我的問題是:有什麼區別,如果有的話,在這兩個表達式:二維零數組
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
將zeros
是一樣的嗎?哪一個更適合使用速度和可讀性?
python中沒有數組類型,但爲了模擬它,我們可以使用列表。我想要用零填充2d類似於數組的結構。我的問題是:有什麼區別,如果有的話,在這兩個表達式:二維零數組
zeros = [[0 for i in xrange(M)] for j in xrange(M)]
和
zeros = [[0]*M]*N
將zeros
是一樣的嗎?哪一個更適合使用速度和可讀性?
您應該使用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
不在桌面上,這是我將使用的表單。
在第二種情況下,你創建的同一列表的引用列表。如果你有這樣的代碼: [LST] * N,其中LST是一個列表的引用,您將有以下列表: [LST,善堂,善堂,善堂,...,LST]。但是因爲結果列表包含對同一對象的引用,所以如果在一行中更改值,則將在其他所有行中更改。
用於Python 3(沒有更多的xrange),優選的答案
zeros = [ [0] * N for _ in range(M)]
爲零
是否真的必要簡單地使用numpy的該單一特徵的M×N陣列?第一版+1。 – John
@johnthexiii - 可能不是。但是,如果OP想要一個二維數組的零,我會願意出去走走,並說OP的代碼也可能從其他地方的numpy中受益。 – mgilson
我不會安裝numpy只是爲了清零;)感謝以後的解釋,這正是我一直在尋找的。 – yakxxx