標籤:

NumPy中的維度(dimension)、軸(axis)、秩(rank)的含義

在學習NumPy的時候,其中最重要的就是學習它的 ndarray 對象,它是多維度的同數據類型的數組。這個和Python自帶的列表有較大的區別,列表中的元素類型是可以不相同的,如一個列表中,它可以包含數字、字元、字元串等,而在數組中,它的數據類型是相同的,如都是整型或者浮點型。

為什麼Python中已經有了列表之後,在NumPy中還要引進一個數組對象呢?有以下三點可以作為參考,但在本文中不做具體描述:

  1. 數組對象可以去掉元素間運算所需的循環,使一維向量更像單個數據
  2. 設置專門的數組對象,經過優化,可以提升這類應用的運算速度
  3. 數組對象採用相同的數據類型,有助於節省運算和存儲空間

NumPy中有幾個概念比較繞,對於我來說比較難理解,因此以此文作為記錄。它們分別是:維度、軸、秩。

對於維度的介紹,官網是這麼寫的「 In NumPy dimensions are called axes」,即維度稱為軸。為了更直觀的理解,可以將其與現實世界聯繫起來,比如在平面中即二維的世界中,我們描述一個點的時候,通常使用 x 軸、y 軸,這樣就能確定一個點的具體位置了。因此,這裡的兩個維度,也就跟兩個軸對應了起來。如果是立體的三維世界中,我們就會多出一個z軸,以此更加準確的來反映點的位置。所以,我么可以把以上的維度和軸進行等價。

什麼是秩(rank)?它是指軸的數量,或者維度的數量,是一個標量

在下面的例子中,有一個數組 [1,2,1], 它的維度是1,也就是有一個軸,這個軸的長度是3,而它的秩也為1。這些信息,都可以通過NumPy提供的數組屬性來獲得。

ndarray.ndim

the number of axes (dimensions) of the array

秩,數組軸的數量,或者維度的數量

ndarray.shape

the dimensions of the array. This is a tuple of integers indicating the size of the array in each dimension. For a matrix with n rows and m columns, shape will be (n,m). The length of the shape tuple is therefore the number of axes, ndim.

數組的維度。它的返回值是一個元組,這個元組描述了每個維度中數組的大小。相對於一個矩陣來說,shape表示的就是n行m列。這個元組的長度,等價於軸/維度的個數,即秩的值

依舊以下圖為例,我們已經知道數組a的維度數是1。查看它的shape,返回值為元組(3,) ,從這裡也可以反映出這個數組的基本形狀,即它是1維的,在這1維的空間中,擁有3個數據。

現在我們升級為一個2維的數組。如下圖中的數組b,從屬性 ndim 中可以知道,它的秩為2,即軸的個數是2,或者維度的數量是2(行和列兩個維度)。shape中反映出來的是,它是2行3列的一個矩陣。

當前軸的數量已經上升為2,那麼NumPy中是怎麼定義這個軸的方向的呢?在二維中,軸0表示了數組的行,軸1表示了數組的列,見下方的示意圖。因此,在該列中軸0的長度是2,軸1的長度是3。

如果我們把軸0上的數進行相加,可以得到一個一維數組,值為[5,7,9],數組的元素個數為3。

如果我們把軸1上的數進行相加,也可以得到一個一維數組,但值為[6, 15],數組的元素個數為2。

所以在不同軸上進行數據操作會得到不同的值,數組中的值是由沿軸方向上的數據相加所得。

現在,我們再升級一個維度,使其成為一個3維數組,如下所示。秩的值已經變為3,它的shape反映出它的軸0長度為2,軸1長度為2,軸2的長度為3。

軸0-軸2,他們具體是怎麼表現的呢?參見下面的圖示,從圖中可以看到,NumPy對於軸的編號由外向內,從行到列。

我們通過求和運算來驗證上面軸方向的猜測是否正確。

先計算軸0上的數值,從示意圖中看更像是,從表面到內部的一次「疊加」操作。這樣計算後的一個結果,應該是一個2行3列的一個數組,形狀如下:

[12, 14, 16]

[18, 20, 22]

再計算軸1上的數值,從示意圖中可以看出,這像是從上到下的一次「疊加」操作,計算後的值也是一個2行3列的新數組,形狀如下:

[5, 7, 9]

[25, 27, 29]

繼續計算軸2上的數值,這次像是一次「右移疊加」的操作,形成的結果是一個2行2列的新數組,形狀如下:

[6, 15]

[36, 45]

以下是運行結果,和我們的計算結果一致

對於3維及更高維度的數組,理解及計算起來比較複雜。因此,我們也可以採用降維的方法來進行計算,如果維度降到二維,那麼就非常便於我們的理解,簡單的說就是「替換、降維打擊」。

依舊以上面的三維數組c為例,我們只關心最外層的兩個維度,將最內層維度的數據看成一個整體。

轉化後的形狀就如下圖所示,這時我們計算軸0就等於計算 A+C,B+D;計算軸1就等於計算 A + B,C + D

運行結果如下所示

軸2要怎麼計算呢?由於我們上面已經將最內層的數組看成了一個整體,如圖所示。所以,我們計算軸2,就等同於對數組 A、B、C、D進行分別求和

參考:

1, deepage.net/features/nu

2,flat2010.github.io/2017


推薦閱讀:

TAG:numpy | Python |