淺談NumPy中的維度Axis
NumPy中的維度是一個很重要的概念,很多函數的參數都需要給定維度Axis,如何直觀的理解維度呢?我們首先以二維數組為例進行說明,然后推廣到多維數組。
(有人將ndim屬性叫維度,將axis叫軸,我還是習慣將axis稱之為維度,axis=0稱為第一個維度)
二維數組的列子
import numpy as np x = np.random.randint(0, 9, (2, 3)) x Out[4]: array([[6, 5, 2], [0, 6, 7]]) x.ndim Out[5]: 2 x.shape Out[6]: (2, 3) x[0] Out[7]: array([6, 5, 2]) x[:, 0] Out[8]: array([6, 0]) x.sum(axis=0) Out[9]: array([ 6, 11, 9]) x.sum(axis=1) Out[10]: array([13, 13])
看上面這個例子,x是一個2行3列的數組,所以x是一個二維數組。
從第6和第7個輸入輸出,我們可以肯定地說"對於二維數組,第一維指的是行,第二維指的是列"。
我們通過sum求和函數,探究一下x的第一維和第二維的意義?從第8個和第9個輸入輸出,我們可以看到對於參數axis=0,其結果是數組列的和;而對於參數axis=1,其參數是數組行的和。
對於axis=0第一個維度求和,不是將第一維度(行)中的所有元素相加,而是沿着第一個維度,將對應其他維度(列)的數據相加,分解開來就是第10個輸入輸出。同理,對於axis=1,是沿着列,將行中的元素相加。
NumPy中對於維度的操作都是以類似這樣的邏輯操作的。
所以,我的結論就是:在概念上維度是從整體到局部看的,最外圍的是第一個維度,然后依次往里,最內部的就是最后一維。
np.stack
numpy.stack(arrays, axis=0)
沿着新軸連接數組的序列。
axis參數指定新軸在結果尺寸中的索引。例如,如果axis=0,它將是第一個維度,如果axis=-1,它將是最后一個維度。
參數: 數組:array_like的序列每個數組必須具有相同的形狀。axis:int,可選輸入數組沿其堆疊的結果數組中的軸。
返回: 堆疊:ndarray堆疊數組比輸入數組多一個維。
import numpy as np a = np.random.randint(0, 9, (2, 3)) a Out[32]: array([[0, 0, 4], [2, 4, 3]]) b = np.stack([a, a], axis=0) b[0] == a Out[34]: array([[ True, True, True], [ True, True, True]]) b.shape Out[35]: (2, 2, 3) b = np.stack([a, a], axis=1) b.shape Out[37]: (2, 2, 3) b[:,0,:] == a Out[38]: array([[ True, True, True], [ True, True, True]]) b = np.stack([a, a], axis=2) b[: ,:, 0] == a Out[40]: array([[ True, True, True], [ True, True, True]]) b.shape Out[41]: (2, 3, 2)
當從axis=0維度進行堆疊時,則a[i]相當於堆疊的第i個array
當從axis=1維度進行堆疊時,則a[:,i,:]相當於堆疊的第i個array
當從axis=2維度進行堆疊時,則a[:,:,i]相當於堆疊的第i個array。
例如:
當有(B, C)維度大小的arr需要對每一行的數據重復R次,生成(B,R,C)維度的數據時,就用
np.stack([a] * R, axis=1)
np.concatenate()
numpy.concatenate((a1, a2, ...), axis=0) # 按維度拼接,如3x5的arr與5x5的矩陣拼接為8x5的矩陣
a = np.zeros((3,4)) b = np.ones((2, 4)) c = np.concatenate([a, b], axis=0) c.shape Out[50]: (5, 4)