天天看點

一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題

Numpy庫的核心是ndarray,實際上就是N維數組(N-dimensional array),關于這個資料對象的詳細介紹,參考官方文檔最為合适。有一點要注意的是,ndarray的内置方法隻有30多個,常用的如求平均值可以寫

a.mean()

,但是求中位數就不可以,隻能寫

np.median(a)

言歸正傳,在Numpy中次元dimension被稱為軸axis(複數為axes)。對于一維數組,如

a = np.array([1, 2, 3])

a.shape

等于(3, )。

根據廣播機制的規則一,小次元數組的shape在最左邊補1,是以一維數組會被隐式解釋為二維行向量,當矩陣乘以行向量時,可以使用形狀 (n, ) 或 (1, n) 得到相同的結果。但是注意一維數組不能通過轉置變為二維列向量。

一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題

更具體的,一維數組、二維行向量與二維列向量的轉換方式如下:

一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題

其中,

flatten()

ravel()

方法都是将數組展平為一維數組。兩者之間的主要差別在于,

ravel()

生成的是對父數組的引用(即“視圖”),這意味着對新數組的任何更改也會影響父數組,由于ravel不建立副本,是以記憶體效率高。

flatten()

則是建立了一個副本,對副本進行修改不會影響父數組。

在很多方法中,軸是作為參數出現的

axis=0, 1, ...

,如下:

一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題
一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題
一文弄懂Numpy中ndarray的次元(dimension)/軸數(axis/axes)問題

對于軸參數,我們應該了解為“将要被消除或折疊的次元或軸”,而不是将要傳回的次元或軸。是以,

axis=0

意味着行将要被折疊,多行将會變成一行;

axis=1

意味着列将要被折疊,多列将會變成一列。