這篇文章將討論如何在 Python 中構造和初始化二維列表。
您絕不能使用表達式初始化二維列表 [[val]*c]*r
.這可能會導致引用錯誤,因為結果列表包含重複的相同列表實例 r
次。以下示例演示了此行為:
1 2 3 4 5 6 7 8 9 10 11 |
if __name__ == '__main__': val = 1 (M, N) = (2, 3) # 生成一個用 val 初始化的 `M × N` 矩陣 x = [[val] * N] * M x[0][0] = 2 print(x) # [[2, 1, 1], [2, 1, 1]] |
這篇文章概述了在 Python 中正確創建和初始化二維列表的一些可用替代方法。
1. 使用列表理解
在 Python 中初始化二維列表的一個簡單而優雅的解決方案是使用列表推導:
1 2 3 4 5 6 7 8 9 10 11 |
if __name__ == '__main__': val = 1 (M, N) = (4, 5) # 生成一個用 val 初始化的 `M × N` 矩陣 x = [[val for i in range(N)] for j in range(M)] for r in range(M): print(x[r]) |
這可以進一步縮短如下:
1 2 3 4 5 6 7 8 9 10 11 |
if __name__ == '__main__': val = 1 (M, N) = (4, 5) # 生成一個用 val 初始化的 `M × N` 矩陣 x = [[val]*N for _ in range(M)] for r in range(M): print(x[r]) |
2. 使用 NumPy
或者,您可以使用 NumPy 在 Python 中聲明和初始化二維列表。下面是代碼的樣子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np if __name__ == '__main__': val = 1 (M, N) = (4, 5) # 生成“int”類型的 `M × N` 矩陣 x = np.empty((M, N), dtype=int) # 用 `val` 初始化矩陣 x.fill(val) for r in range(M): print(x[r]) |
使用 NumPy 1.8,您可以使用 np.full()
函數,它在一個步驟中聲明和初始化矩陣。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np if __name__ == '__main__': val = 1 (M, N) = (4, 5) # 生成一個用 val 初始化的 `M × N` 矩陣 x = np.full((M, N), val, dtype=int) for r in range(M): print(x[r]) |
如果您需要一個值初始化為全零或一的矩陣,您可以使用 np.zeros()
和 np.ones()
函數,分別為:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import numpy as np if __name__ == '__main__': (M, N) = (4, 5) # 生成一個用零初始化的 `M × N` 矩陣 x = np.zeros((M, N), dtype=int) for r in range(M): print(x[r]) # 生成一個用 1 初始化的 `M × N` 矩陣 y = np.ones((M, N), dtype=int) for r in range(M): print(x[r]) |
使用 NumPy 構建二維列表的另一種可行方法是創建一個填充了所需值的一維列表,然後使用 np.reshape()
功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np if __name__ == '__main__': val = 1 (M, N) = (5, 5) # 生成一個用 val 初始化的 `M × N` 矩陣 x = np.list([val] * M * N).reshape((M, N)) for r in range(M): print(x[r]) |
這就是在 Python 中聲明和初始化二維列表的全部內容。