NumPy 建立陣列

0 元素矩陣

np.zeros

np.zeros 可以用來建立以 0 為元素的矩陣,它的語法如下,

np.zeros(shape, dtype=float, order='C')

其中 shape 就是所要生成的矩陣的尺寸,可以為一維,二維和多維。資料型別預設為 float64,當然你可以指定具體的其他資料型別。

我們來建立幾個零元素矩陣

>>> import numpy as np
>>> np.zeros(5)		# 生成一個元素為 5 個 0 的一維矩陣
array([0., 0., 0., 0., 0.])
>>> np.zeros(5, dtype='int8')	#生成一個元素為 5 個 0 的一維矩陣,資料型別為 int8
array([0, 0, 0, 0, 0], dtype=int8)
>>> np.zeros((4, 3)) # 生成一個 4 行 3 列的零矩陣
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

np.empty

有些情況下,你只是想初始化一個矩陣為指定尺寸的矩陣,對裡面的初始化資料並不關心,那你可以使用 np.empty 來實現更快的初始化,但要注意的一點時,它並不保證裡面的資料為 0。

我們可以通過%timeit 來具體比較下 np.empty()np.zeros() 的執行時間,

In [1]: %timeit np.empty((100, 100))
    715 ns ± 11.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [2]: %timeit np.zeros((100, 100))
    4.03 µs ± 104 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

很明顯的,np.empty() 在初始化的時候要比 np.zeros() 快得多,在矩陣尺寸為 (100, 100) 的測試條件下,它只需要大約 17.5%的時間。

np.zeros_like

假如有些情況下,我們已經有一個矩陣,我們想生成一個跟它具有相同尺寸的零矩陣,我們可以用傳統的方法來建立,

test = np.array([[1,2,3],[4,5,6],[7,8,9]])
np.zeros(test.shape)

或者我們可以用 NumPy 的另外一個函式 np.zeros_like() 直接來生成,效率更高。

x = np.zeros_like(test)
注意
np.zeros_like() 的形狀跟輸入矩陣一樣,而且資料型別也是一樣的。

1 元素矩陣

np.ones

同理,我們也可以快速生成元素全為 1 的矩陣,np.ones() 的用法和輸入引數跟 np.zeros() 的完全一致。

>>> import numpy as np
>>> np.ones(5)		# 生成一個元素為 5 個 1 的一維矩陣
array([1., 1., 1., 1., 1.])
>>> np.ones(5, dtype='int8')	#生成一個元素為 5 個 1 的一維矩陣,資料型別為 int8
array([1, 1, 1, 1, 1], dtype=int8)
>>> np.ones((4, 3)) # 生成一個 4 行 3 列的元素為 1 的矩陣
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

np.ones_like

np.zeros_like 一樣,np.ones_like 可以用來更高效的生成與輸入矩陣具有相同形狀的元素為 1 的矩陣。

>>> test = np.array([[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]])
>>> np.ones_like(test)
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

對角矩陣

對角矩陣是對角線上元素為 1,其他位置元素為 0 的矩陣。可以通過 np.eye() 函式來生成此型別矩陣,它的語法如下

np.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')

其中,

引數名稱 資料型別 摘要
N INT 指定生成的矩陣的行數。
M INT (可選)預設值為 None。 指定要生成的矩陣的列數。當它為 None 時,它變為與 N 相同的值。
k INT (可選)預設值為 0。 0 為主對角線位置,如果 k 的值為正,則 1 元素向上平移 k 次,如果 k 為負,則 1 元素向下平移 k 次,
dtype 資料型別 (可選)預設值為 float 指定生成的陣列的元素的資料型別。

np.eye() 舉例

>>> import numpy as np
>>> np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
>>> np.eye(4, 3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.]])
>>> np.eye(3, 4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.]])
>>> np.eye(4, k=1)
array([[0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 0.]])

np.identity()

np.identity 可以被看成是一種特殊的 np.eye,它用來生成的矩陣是一個方陣,也就是行列數相等的矩陣。語法如下,

numpy.identity(n, dtype = float)
引數名稱 資料型別 說明
n INT 指定要生成的矩陣的大小。生成 N×N 方陣。
dtype 資料型別 (可選)預設值為 float。 指定元素的資料型別。

np.identity() 舉例

>>> import numpy as np
>>> np.identity(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

三角矩陣

可以通過 np.tri() 來生成三角矩陣,函式呼叫語法如下,

numpy.tri(N, M=None, k=0, dtype=<class 'float'>)

其輸入引數跟 np.eye() 類似,可以作為參考。

np.tri() 舉例

>>> import numpy as np
>>> np.tri(3)
array([[1., 0., 0.],
       [1., 1., 0.],
       [1., 1., 1.]])
>>> np.tri(4, k=1)
array([[1., 1., 0., 0.],
       [1., 1., 1., 0.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])