如何在 Python 中建立二維陣列

Jinku Hu 2023年1月30日 2019年12月13日
  1. 列表推導式
  2. 巢狀 range 方法
  3. NumPy 方法
如何在 Python 中建立二維陣列

本教程將介紹在 Python 中建立二維陣列的不同方法。3x5 在以下示例中,我們將建立一個二維陣列。

列表推導式

>>> column, row = 3, 5
>>> array2D = [[0 for _ in range(row)] for _ in range(column)]
>>> array2D
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

此巢狀列表推導式建立初始值為 0 的二維陣列。當然,你可以將初始值更改為需要在應用程式中分配的任何值。

巢狀 range 方法

如果你不關心二維陣列中的初始值,甚至可以省略 0 值。

在 Python 2.x 中

>>> column, row = 3, 5
>>> A = [range(row) for _ in range(column)]
>>> A
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

在 Python 3.x 中

>>> column, row = 3, 5
>>> A = [range(row) for _ in range(column)]
>>> A
[range(0, 5), range(0, 5), range(0, 5)]

我們不能簡單地在 Python 3.x 中使用 range(x) 初始化 2-D 陣列,因為在 Python 3.x 中 range 返回的物件包含整數序列,而不是像在 Python 2.x 中返回的整數列表。

range 在 Python 3.x中更類似於 Python2.x 中的 xrange。Python 3.x 中的 range 型別資料是不可變的,因此,你不能為分配元素。

如果需要元素分配,則需要將轉換 rangelist 物件。

>>> A = [list(range(row)) for _ in range(column)]
>>> A
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

[0] * N 方法

建立 2-D 陣列的一種 Pythonic 方法可以為,

>>> column, row = 3, 5
>>> A = [[0]*row for _ in range(column)]
>>> A
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

儘管我們在使用列表乘法時要謹慎,因為它只會建立一個多次引用同一物件的序列,但 [0]*n 由於資料物件 0 是不可變的,因此我們放心使用此處,即使引用相同的不可變的資料也不會遇到問題。

NumPy 方法

除了原生 Python 陣列之外,NumPy 應該是建立二維陣列或更準確地說是矩陣的最佳選擇。

你可以使用建立一個零填充的矩陣 numpy.zeros

>>> import numpy as np
>>> column, row = 3, 5
>>> np.zeros(column, row)
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

或者用 numpy.ones 建立一個填充 ones 的矩陣。

>>> import numpy as np
>>> column, row = 3, 5
>>> np.ones((column, row))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])

你甚至可以用 numpy.empty 建立一個新陣列,而無需命令初始化元素。

>>> import numpy as np
>>> column, row = 3, 5
>>> np.empty((5,5))
array([[6.23042070e-307, 4.67296746e-307, 1.69121096e-306,
        1.33511562e-306, 1.89146896e-307],
       [7.56571288e-307, 3.11525958e-307, 1.24610723e-306,
        1.37962320e-306, 1.29060871e-306],
       [2.22518251e-306, 1.33511969e-306, 1.78022342e-306,
        1.05700345e-307, 1.11261027e-306],
       [1.11261502e-306, 1.42410839e-306, 7.56597770e-307,
        6.23059726e-307, 1.42419530e-306],
       [7.56599128e-307, 1.78022206e-306, 8.34451503e-308,
        2.22507386e-306, 7.20705877e+159]])
Notes
先建立空陣列,然後再分配元素值,這是一個不錯的習慣。但是請注意,隨機值位於陣列中,因此如果在分配了對應索引位置的值之前通過索引訪問陣列,則可能會有風險,讀到了你沒有意想之外的值。
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - Python Array