numpy:維度問題


淺談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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM