Numpy 的 ndarray 對象
本小節(jié)將詳述如何創(chuàng)建 ndarray 對象,以及如何創(chuàng)建特殊的 ndarray 對象。
1. ndarray 對象
ndarray,也就是我們常用的 N 維數(shù)組對象,是 Numpy 最核心的組成部分。你可以把它視為一個快速而靈活的大數(shù)據(jù)集容器,利用這種數(shù)組你可以便捷地執(zhí)行一些數(shù)學運算。
ndarray 有兩個顯著特點:
- ndarray 是一個通用的同構數(shù)據(jù)多維容器,也就是說,該容器中的每一個元素都必須是相同類型的,且每個元素在內(nèi)存中都有相同存儲大小的區(qū)域;
- ndarray 具有矢量算術運算能力和復雜的廣播能力,并具有執(zhí)行速度快和節(jié)省空間的特點。
2. 創(chuàng)建 ndarray
2.1 numpy.array 函數(shù)
創(chuàng)建數(shù)組對象最簡單的方法是利用 array 函數(shù),該函數(shù)的輸入為序列型對象,輸出為一個含有傳入數(shù)據(jù)的 Numpy 數(shù)組。 array 函數(shù)的常用調(diào)用參數(shù)如下:
numpy.array(object, dtype=None, copy=True, ndmin=0)
參數(shù) | 說明 |
---|---|
object |
array 的主要輸入?yún)?shù),可以是數(shù)組、有序序列,或者是嵌套的序列 |
dtype |
數(shù)據(jù)類型,用來指定生成的ndarray 數(shù)據(jù)結構的元素類型 |
copy |
對象是否被復制,默認為True |
ndmin |
指定返回數(shù)組的最小維數(shù) |
Tips:關于數(shù)據(jù)類型相關知識,我們會在下個小節(jié)詳細講解。
案例
以列表轉(zhuǎn)換為例:
import numpy as np
data0 = [1, 4, 3, 7, 2]
arr0 = np.array(data0)
arr0
這里通過 array 函數(shù),輸入列表,輸出一個數(shù)組對象。
Out:
array([1, 4, 3, 7, 2])
在上述案例中,并未指定dtype
。這是因為在通常情況下,np.array
函數(shù)會嘗試為新建的數(shù)組推斷出一個合理的數(shù)據(jù)類型:
arr0.dtype
Out:
dtype('int32')
可以看到自動創(chuàng)建的數(shù)據(jù)類型為int32
。
案例
當然了,你可以在開始的時候,利用dtype
參數(shù),顯式地指定數(shù)組元素的數(shù)據(jù)類型。這里我們以一個嵌套列表為例,進行說明:
data1 = [[1, 2, 3.2], [4, 5.1, 6], [7.3, 8, 9]]
arr1 = np.array(data1, dtype='float')
arr1
這里通過 array 函數(shù),輸入嵌套列表,并同時指定數(shù)據(jù)類型為 float,輸出對應的數(shù)組對象。
Out:
array([[1. , 2. , 3.2],
[4. , 5.1, 6. ],
[7.3, 8. , 9. ]])
查看數(shù)組對象的數(shù)據(jù)類型為float64。
arr1.dtype
Out:
dtype('float64')
案例
也可以利用 ndmin
參數(shù),手動指定創(chuàng)建數(shù)組的維數(shù):
arr2 = np.array(data0, ndmin=2)
arr2
Out:
array([[1, 4, 3, 7, 2]])
這里利用 ndmin
參數(shù),手動創(chuàng)建了一個二維數(shù)組。
3. 常用的 ndarray 創(chuàng)建函數(shù)
除 np.array
之外,Numpy 內(nèi)置了一些其他方法,可以快速創(chuàng)建一些具有特殊特征的數(shù)組。比如,利用 zeros
函數(shù)和 ones
函數(shù)可以創(chuàng)建一個指定大小的全 0 或全 1 的數(shù)組。
3.1 numpy.zeros 函數(shù)
zeros 函數(shù)可以創(chuàng)建一個指定大小的、以 0 來填充的數(shù)組。
案例
創(chuàng)建一個長度為 4 的全 0 數(shù)組:
np.zeros(4)
Out:
array([0., 0., 0., 0.])
3.2 numpy.ones 函數(shù)
ones 函數(shù)可以創(chuàng)建一個指定大小的、以 1 來填充的數(shù)組。
案例
創(chuàng)建一個大小為 3×3 的全 0 數(shù)組方陣:
np.ones((3,3))
Out:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
需要注意的是,對于創(chuàng)建 2 維及以上的數(shù)組時,zeros
函數(shù)和 ones
函數(shù)接收一個表示數(shù)組大小的元組 tuple
作為輸入。
3.3 numpy.empty 函數(shù)
類似的,empty 函數(shù)用來創(chuàng)建一個指定大小的、沒有具體值的數(shù)組。
案例
這里我們創(chuàng)建一個 3×2×3 的三維空數(shù)組:
np.empty((3,2,3))
Out:
array([[[4.67296746e-307, 1.69121096e-306, 1.33511018e-306],
[1.33511018e-306, 1.86917476e-306, 1.11256817e-306]],
[[1.06811422e-306, 1.42417221e-306, 1.11260619e-306],
[8.90094053e-307, 1.86919378e-306, 1.06809792e-306]],
[[1.37962456e-306, 1.69111861e-306, 1.78020169e-306],
[1.37961777e-306, 7.56599807e-307, 7.56599806e-307]]])
這里要注意一下 empty 函數(shù)的輸出。因為 empty 考慮到輸出全 0 數(shù)組是不安全的想法,因此很多情況下,它返回的是一些沒有規(guī)律的垃圾值。
Numpy 還提供了創(chuàng)建單位方陣(對角線為 1,其余為 0)的方法:identity 和 eye。
3.4 numpy.identity 函數(shù)
identity 函數(shù)用來創(chuàng)建一個指定大小的單位矩陣(對角線為 1 的數(shù)組)。
案例
這里我們利用 identity 函數(shù)來創(chuàng)建一個大小為 3×3 的單位矩陣:
np.identity(3)
Out:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
3.5 numpy.eye 函數(shù)
eye 函數(shù)用來創(chuàng)建一個指定大小的、對角線為 1 的數(shù)組。
eye 函數(shù)是 identity 的升級版本。eye 函數(shù)的原型如下:
np.eye(N, M=None, k=0, dtype=<type ‘float’>)
當 k 為默認值時,eye 函數(shù)可以創(chuàng)建大小為 N×M,主對角線為 1 的矩陣。
案例
創(chuàng)建一個大小為 3×4 的主對角線為 1 的數(shù)組。
np.eye(N=3, M=4)
Out:
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]])
案例
當 k、M 均為默認值時,eye 函數(shù)的功能和 identity 一致。
例如,利用 eye 函數(shù)創(chuàng)建一個大小為 3×3 的單位矩陣。
np.eye(N=3)
Out:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
k 表示為 1 的對角線的偏移量,當 k 大于 0 時,表示向右偏移。
例如,創(chuàng)建一個大小為 3×4 的數(shù)組,為 1 的對角線向右偏移一位:
np.eye(N=3, M=4, k=1)
Out:
array([[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
4. 小結
本小節(jié)重點講述了如何利用序列型對象,創(chuàng)建一個數(shù)組序列;以及如何創(chuàng)建常用的特殊數(shù)組,例如:全 0 數(shù)組、全 1 數(shù)組,全空數(shù)組、對角線為 1 的數(shù)組等。