作者:韓信子@ShowMeAI
教程地址:https://www.showmeai.tech/tutorials/33
本文地址:https://www.showmeai.tech/article-detail/143
聲明:版權所有,轉載請聯系平台與作者並注明出處
n維數組是NumPy的核心概念,大部分數據的操作都是基於n維數組完成的。本系列內容覆蓋到1維數組操作、2維數組操作、3維數組操作方法,本篇講解Numpy與2維數組操作。
一、向量初始化
NumPy中曾有一個專用的matrix類來代表矩陣,后來被棄用,現在NumPy中的矩陣和2維數組表示同一含義。
(1)矩陣初始化
矩陣初始化的語法與向量是類似的:
如上要使用雙括號,這里的(3,2)是第1個參數表示矩陣維度,第2個位置參數(可選)是為dtype(也接受整數)保留的。
(2)隨機矩陣生成
隨機矩陣的生成也與向量類似:
(3)二維數組索引
二維數組的索引語法要比嵌套列表更方便:
“view”表示數組切片時並未進行任何復制,在修改數組后,相應更改也將反映在切片中。
二、軸參數
在很多矩陣運算操作中,NumPy可以實現跨行或跨列的操作。為了適用任意維數的數組,NumPy引入了axis的概念。
axis參數的值實際上就是維度值,如第一個維是axis=0
,第二維是axis=1
,依此類推。因此,在2維數組中,axis=0指列方向,axis=1
指行方向。
三、矩陣運算
除了+,-,_,/,//和*_等數組元素的運算符外,NumPy提供了@ 運算符計算矩陣乘積:
類似一維向量中的廣播機制,NumPy同樣可以通過廣播機制實現向量與矩陣,或兩個向量之間的混合運算,如下圖所示:
注意,上圖最后一個示例是對稱的逐元素乘法。使用矩陣乘法@可以計算非對稱線性代數外積,兩個矩陣互換位置后計算內積:
四、行向量與列向量
在NumPy的2維數組中,行向量和列向量是被區別對待的。通常NumPy會盡可能使用單一類型的1維數組(例如,2維數組a的第j列a[:, j]是1維數組)。默認情況下,一維數組在2維操作中被視為行向量,因此,將矩陣乘行向量時,使用形狀(n,)或(1,n)的向量結果一致。有多種方法可以從一維數組中得到列向量,但並不包括transpose:
使用reshape操作添加新的axis可以更新數組形狀和索引,也可以將1維數組轉化為2維列向量:
其中,-1表示在reshape是該維度自動決定,方括號中的None等同於np.newaxis,表示在指定位置添加一個空軸。
總結一下,NumPy中共有三種類型的向量:1維數組,2維行向量和2維列向量。以下是兩兩類型轉換圖:
根據廣播規則,一維數組被隱式解釋為二維行向量,因此通常不必在這兩個數組之間進行轉換,對應圖中陰影化區域。
嚴格來說,除一維外的所有數組的大小都是一個向量(如a.shape == [1,1,1,5,1,1]),因此NumPy的輸入類型是任意的,但上述三種最為常用。可以使用np.reshape將一維矢量轉換為這種形式,使用np.squeeze可將其恢復。這兩個功能都通過view發揮作用。
五、矩陣操作
矩陣的拼接有以下兩種方式:
圖示操作僅適用於矩陣堆疊或向量堆疊,而一維數組和矩陣的混合堆疊只有通過vstack才可實現,hstack會導致維度不匹配錯誤。因為前文提到將一維數組作為行向量,而不是列向量。為此,可以將其轉換為行向量,或使用專門的column_stack函數執行此操作:
與stack對應的是split,可以對矩陣進行切分處理:
矩陣復制有兩種方式:
- tile類似粘貼復制;
- repeat相當於分頁打印。
delete可以刪除特定的行或列:
相應插入操作為insert:
與hstack一樣,append函數無法自動轉置1D數組,因此需要重新調整向量形狀或添加維數,或者使用column_stack:
如果僅僅是向數組的邊界添加常量值,pad函數是足夠的:
六、Meshgrids網格
廣播機制使得meshgrids變得容易。例如需要下圖所示(但尺寸大得多)的矩陣:
上述兩種方法由於使用了循環,因此都比較慢。MATLAB通過構建meshgrid處理這種問題。
meshgrid函數接受任意一組索引,通過mgrid切片和indices索引生成完整的索引范圍,然后,fromfunction函數根據I和J實現運算。
在NumPy中有一種更好的方法,無需在內存中存儲整個I和J矩陣(雖然meshgrid已足夠優秀,僅存儲對原始向量的引用),僅存儲形狀矢量,然后通過廣播規實現其余內容的處理:
如果沒有indexing =’ij’參數,那么meshgrid將更改參數的順序,即J,I=np.meshgrid(j,i)——一種用於可視化3D繪圖的“ xy”模式(祥見該文檔)。
除了在二維或三維網格上初始化函數外,網格還可以用於索引數組:
以上方法在稀疏網格中同樣適用。
七、矩陣統計
就像sum函數,NumPy提供了矩陣不同軸上的min/max, argmin/argmax, mean/median/percentile, std/var等函數。
np.amin
等同於np.min
,這樣做同樣是為了避免from numpy import *
可能的歧義。
2維及更高維中的argmin和argmax函數分別返回最小和最大值的索引,通過unravel_index函數可以將其轉換為二維坐標:
all和any同樣也可作用於特定維度:
八、矩陣排序
雖然在前文中,axis參數適用於不同函數,但在二維數組排序中影響較小:
我們通常不需要上述這樣的排序矩陣,axis不是key參數的替代。但好在NumPy提供了其他功能,這些功能允許按一列或幾列進行排序:
1、a[a [:,0] .argsort()]
表示按第一列對數組進行排序:
其中,argsort返回排序后的原始數組的索引數組。
可以重復使用該方法,但千萬不要搞混:
a = a[a[:,2].argsort()]
a = a[a[:,1].argsort(kind='stable')]
a = a[a[:,0].argsort(kind='stable')]
2、函數lexsort可以像上述這樣對所有列進行排序,但是它總是按行執行,並且排序的行是顛倒的(即從下到上),其用法如下:
a[np.lexsort(np.flipud(a[2,5].T))]
,首先按第2列排序,然后按第5列排序;a[np.lexsort(np.flipud(a.T))]
,從左到右依次排序各列。
其中,flipud沿上下方向翻轉矩陣(沿axis = 0方向,與a [::-1,…]等效,其中…表示“其他所有維度”),注意區分它與fliplr,fliplr用於1維數組。
3、sort函數還有一個order參數,但該方法極不友好,不推薦學習。
4、在pandas中排序也是不錯的選擇,因為在pandas中操作位置確定,可讀性好且不易出錯:
pd.DataFrame(a).sort_values(by=[2,5]).to_numpy()
,先按第2列排序,再按第5列排序。pd.DataFrame(a).sort_values().to_numpy()
,按從左到右的順序對所有列進行排序。
資料與代碼下載
本教程系列的代碼可以在ShowMeAI對應的github中下載,可本地python環境運行,能訪問Google的寶寶也可以直接借助google colab一鍵運行與交互操作學習哦!
本系列教程涉及的速查表可以在以下地址下載獲取:
拓展參考資料
ShowMeAI圖解數據分析系列推薦(數據科學家入門)
- 圖解數據分析(1) | 數據分析介紹
- 圖解數據分析(2) | 數據分析思維
- 圖解數據分析(3) | 數據分析的數學基礎
- 圖解數據分析(4) | 核心步驟1 - 業務認知與數據初探
- 圖解數據分析(5) | 核心步驟2 - 數據清洗與預處理
- 圖解數據分析(6) | 核心步驟3 - 業務分析與數據挖掘
- 圖解數據分析(7) | 數據分析工具地圖
- 圖解數據分析(8) | Numpy - 統計與數據科學計算工具庫介紹
- 圖解數據分析(9) | Numpy - 與1維數組操作
- 圖解數據分析(10) | Numpy - 與2維數組操作
- 圖解數據分析(11) | Numpy - 與高維數組操作
- 圖解數據分析(12) | Pandas - 數據分析工具庫介紹
- 圖解數據分析(13) | Pandas - 核心操作函數大全
- 圖解數據分析(14) | Pandas - 數據變換高級函數
- 圖解數據分析(15) | Pandas - 數據分組與操作
- 圖解數據分析(16) | 數據可視化原則與方法
- 圖解數據分析(17) | 基於Pandas的數據可視化
- 圖解數據分析(18) | 基於Seaborn的數據可視化
ShowMeAI系列教程精選推薦
- 大廠技術實現方案系列
- 圖解Python編程:從入門到精通系列教程
- 圖解數據分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大數據技術:從入門到精通系列教程
- 圖解機器學習算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程:吳恩達專項課程 · 全套筆記解讀
- 自然語言處理教程:斯坦福CS224n課程 · 課程帶學與全套筆記解讀
- 深度學習與計算機視覺教程:斯坦福CS231n · 全套筆記解讀