天天看點

《Python資料分析》一2.6 處理數組形狀

本節書摘來自異步社群《python資料分析》一書中的第2章,第2.6節,作者【印尼】ivan idris,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

前面,我們學習過reshape()函數,實際上,除了數組形狀的調整外,數組的擴充也是一個經常碰到的乏味工作。比如,可以想像一下将多元數組轉換成一維數組時的情形。下面的代碼就是用來幹這件事情的,它取自本書代碼包中的shapemanipulation.py檔案:

拉直(flatten):flatten()函數的名字取得非常貼切,其功能與ravel()相同。可是,flatten()傳回的是真實的數組,需要配置設定新的記憶體空間;而ravel()函數傳回的隻是數組的視圖。這意味着,我們可以像下面這樣直接操作數組:

 

用元組指定數組形狀:除reshape()函數外,還可以用元組來輕松定義數組的形狀,如下所示:

可見,上述代碼直接改變了數組的形狀。這樣,我們就得到了一個6×4的數組。

轉置:線上性代數中,矩陣的轉置操作非常常見。轉置是一種資料變換方法,對于二維表而言,轉置就意味着行變成列,同時列變成行。轉置也可以通過下列代碼完成:

調整大小:函數resize()的作用類似于reshape(),但是會改變所作用的數組:

從深度看,數組既可以橫向疊放,也可以豎向疊放。為此,可以使用vstack()、dstack()、hstack()、column_stack()、row_stack()和concatenate()等函數。在此之前,我們先要建立某些數組(以下代碼取自本書代碼包中的stacking.py檔案):

就像前面所說的,可以用下列技術來堆放數組。

水準疊加:先介紹水準疊加方式,即用元組确定ndarrays數組的形狀,然後交由hstack()函數來碼放這些數組。具體如下所示:

用concatenate()函數也能達到同樣的效果,代碼如下所示:

水準疊加過程的示意圖如圖2-1所示:

《Python資料分析》一2.6 處理數組形狀

垂直疊加:使用垂直疊加方法時,先要建構一個元組,然後将元組交給vstack()函數來碼放數組,代碼如下所示:

當參數axis置0時,concatenate()函數也會得到同樣的效果。實際上,這是該參數的預設值,代碼如下所示:

垂直疊加過程的示意圖如圖2-2所示。

《Python資料分析》一2.6 處理數組形狀

深度疊加:除此之外,還有一種深度疊加方法,這要用到dstack()函數和一個元組。這種方法是沿着第三個坐标軸(縱向)的方向來疊加一摞數組。舉例來說,可以在一個圖像資料的二維數組上疊加另一幅圖像的資料,代碼如下所示:

列式堆疊:column_stack()函數以列方式對一維數組進行堆疊。代碼如下所示:

用這種方法堆疊二維數組時,過程類似于hstack()函數,代碼如下所示:

是的,你猜得沒錯!我們用==運算符對兩個數組進行了比對。

行式堆疊:同時,numpy自然也有以行方式對數組進行堆疊的函數,這個用于一維數組的函數名為row_stack(),它将數組作為行碼放到二維數組中,代碼如下所示:

對于二維數組,row_stack()函數相當于vstack()函數,如下所示:

可以從縱向、橫向和深度方向來拆分數組,相關函數有hsplit()、vsplit()、dsplit()和split()。我們既可以把數組分成相同形狀的數組,也可以從規定的位置開始切取數組。下面對相關函數逐個詳解。

橫向拆分:對于一個3×3數組,可以沿着橫軸方向将其分解為3部分,并且各部分的大小和形狀完全一緻,代碼(它取自本書代碼包中的splitting.py檔案)如下所示:

這相當于調用了參數axis=1的split()函數:

縱向拆分:vsplit()函數将沿着縱軸方向分解數組。

當參數axis=0時,split()函數也會沿着縱軸方向分解數組,如下所示:

深向拆分:dsplit()函數會沿着深度方向分解數組。下面以秩為3的數組為例進行說明:

下面舉例說明numpy數組各種屬性的詳細用法。注意,下面的示例代碼取自本書代碼包中的arrayattributes2.py檔案:

除shape和dtype屬性外,ndarray類型的屬性還很多,下面逐一列出。

ndim屬性存儲的是次元的數量,下面舉例說明:

size屬性用來儲存元素的數量,用法如下所示:

itemsize屬性可以傳回數組中各個元素所占用的位元組數,代碼如下所示:

如果想知道存儲整個數組所需的位元組數量,可以求助于nbytes屬性。這個屬性的值正好是itemsize屬性值和size屬性值之積。

t屬性的作用與transpose()函數相同,下面舉例說明:

如果數組的秩(rank)小于2,那麼所得隻是一個數組的視圖:

對于numpy來說,複數用j表示,下面舉例說明如何用複數生成一個數組:

real屬性将傳回數組的實部;當數組元素全為實數時,就傳回數組本身,如下 所示:

i``mag屬性存放的是數組的虛部。

如果數組含有複數,那麼它的資料類型将自動變為複數類型,如下所示:

flat屬性可傳回一個numpy.flatiter對象,這是獲得flatiter對象的唯一方法,但我們無法通路flatiter的構造函數。可以使用flat的疊代器來周遊數組,就像周遊“胖”數組那樣,代碼如下所示:

當然,取得flatiter對象的元素也不難,如下所示:

此外,還可以請求多個元素,如下所示:

同時,還可以給flat屬性指派。不過,需要注意的是,這個值将會覆寫整個數組内所有元素的值,下面舉例說明:

此外,還可以傳回指定的元素,代碼如下:

圖2-3是對ndarray各種屬性的一個小結。

《Python資料分析》一2.6 處理數組形狀

可以把numpy數組轉換成python清單,使用tolist()函數(詳見本書代碼包中的arrayconversion.py檔案)即可。下面簡單解釋一下:

轉換成清單:

astype()函數可以把數組元素轉換成指定類型,代碼如下所示:

提示:

  當complex類型轉換成int類型時,虛部将被丢棄。另外,還需要将資料類型的名稱以字元串的形式傳遞給astype()函數。

上述代碼沒有顯示警告資訊,因為這次使用的是正确的資料類型。