清晰易懂的Numpy入門教程

2021-01-10 機器學習算法那些事

翻譯 | 石頭

來源 | Machine Learning Plus

Numpy是python語言中最基礎和最強大的科學計算和數據處理的工具包,如數據分析工具pandas也是基於numpy構建的,機器學習包scikit-learn也大量使用了numpy方法。本文介紹了Numpy的n維數組在數據處理和分析的所有核心應用。

目錄

1. 如何構建numpy數組

2. 如何觀察數組屬性的大小和形狀(shape)

3. 如何從數組提取特定的項

4. 如何從現有的數組定義新數組

5. 多維數組的重構(reshaping)和扁平(flattening)

6. 如何通過numpy生成序列數(sequences),重複數(repetitions)和隨機數(random)

7. 小結

1. 如何構建numpy數組

構建numpy數組的方法很多,比較常用的方法是用np.array函數對列表進行轉化。

# 通過列表創建一維數組importnumpyasnplist1=[0,1,2,3,4]arr1d=np.array(list1)#列印數組和類型print(type(arr1d))arr1d<type'numpy.ndarray'>[01234]數組和列表最關鍵的區別是:數組是基於向量化操作的,列表不是,我們在實際項目中處理的數據一般是矩陣結構,對該數據以行向量或列向量的形式進行計算,向量計算是基於數組實現的,因此數組比列表的應用更廣。

函數可以應用到數組的每一項,列表不行。

比如,不可以對列表的每一項數據都加2,這是錯誤的。

list1+2# 錯誤可以對數組的某一項數據都加2

# Add 2 to each element of arr1darr1d+2#> array([2, 3, 4, 5, 6])另一個區別是已經定義的numpy數組不可以增加數組大小,只能通過定義另一個數組來實現,但是列表可以增加大小。

然而,numpy有更多的優勢,讓我們一起來發現。

numpy可以通過列表中的列表來構建二維數組。

# Create a 2d array from a list of listslist2=[[0,1,2],[3,4,5],[6,7,8]]arr2d=np.array(list2)arr2d#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])你也可以通過dtype參數指定數組的類型,一些最常用的numpy類型是:'float','int','bool','str'和'object'。

# Create a float 2d arrayarr2d_f=np.array(list2,dtype='float')arr2d_f#> array([[ 0., 1., 2.],#> [ 3., 4., 5.],#> [ 6., 7., 8.]])輸出結果的小數點表示float類型,你也可以通過 astype方法轉換成不同的類型。

# 轉換成『int』類型arr2d_f.astype('int')#> array([[0, 1, 2],#> [3, 4, 5],#> [6, 7, 8]])# 先轉換『int』類型,再轉換『str』類型arr2d_f.astype('int').astype('str')#> array([['0', '1', '2'],#> ['3', '4', '5'],#> ['6', '7', '8']],#> dtype='U21')另一個區別是數組要求所有項是同一個類型,list沒有這個限制。如果你想要一個數組包含不同類型,設置『dtype』為'object'。

# 構建布爾類型數組arr2d_b=np.array([1,0,10],dtype='bool')arr2d_b#> array([ True, False, True], dtype=bool)# 構建包含數值和字符串的數組arr1d_obj=np.array([1,'a'],dtype='object')arr1d_obj#> array([1, 'a'], dtype=object)最終使用 tolist()函數使數組轉化為列表。

# Convert an array back to a listarr1d_obj.tolist()#> [1, 'a']總結數組和列表主要的區別:

數組支持向量化操作,列表不支持;數組不能改變長度,列表可以;數組的每一項都是同一類型,list可以有多種類型;同樣長度的數組所佔的空間小於列表;2. 如何觀察數組屬性的大小和形狀(shape)

一維數組由列表構建,二維數組arr2d由列表的列表構建,二維數組有行和列,比如矩陣,三維數組由嵌入了兩個列表的列表構建。

假設給定一個數組,我們怎麼去了解該數組的屬性。

數組的屬性包括:

數組的維度(ndim)

數組的形狀(shape)

數組的類型(dtype)

數組的大小(size)

數組元素的表示(通過索引)

# 定義3行4列的二維數組list2=[[1,2,3,4],[3,4,5,6],[5,6,7,8]]arr2=np.array(list2,dtype='float')arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 形狀(shape)print('Shape: ',arr2.shape)# 數組類型(dtype)print('Datatype: ',arr2.dtype)# 數組大小(size)print('Size: ',arr2.size)# 數組維度(ndim)print('Num Dimensions: ',arr2.ndim)# 取數組第3行3列元素print('items of 3 line 3 column: ',c[2,2])#> Shape: (3, 4)#> Datatype: float64#> Size: 12#> Num Dimensions: 2#> items of 3 line 3 column: 7

3. 如何從數組提取特定的項

數組的索引是從0開始計數的,與list類似。numpy數組通過方括號的參數以選擇特定的元素。

# 選擇矩陣的前兩行兩列arr2[:2,:2]list2[:2,:2]# 錯誤#> array([[ 1., 2.],#> [ 3., 4.]])numpy數組支持布爾類型的索引,布爾型索引數組與過濾前(array-to-be-filtered)的數組大小相等,布爾型數組只包含Ture和False變量,Ture變量對應的數組索引位置保留了過濾前的值 。

arr2#> array([[ 1., 2., 3., 4.],#> [ 3., 4., 5., 6.],#> [ 5., 6., 7., 8.]])# 對數組每一個元素是否滿足某一條件,然後獲得布爾類型的輸出b=arr2>4b#> array([[False, False, False, False],#> [False, False, True, True],#> [ True, True, True, True]], dtype=bool)# 取布爾型數組保留的原始數組的值arr2[b]#> array([ 5., 6., 5., 6., 7., 8.])3.1 如何反轉數組

# 反轉數組的行arr2[::-1,]#> array([[ 5., 6., 7., 8.],#> [ 3., 4., 5., 6.],#> [ 1., 2., 3., 4.]])# Reverse the row and column positions# 反轉數組的行和列arr2[::-1,::-1]#> array([[ 8., 7., 6., 5.],#> [ 6., 5., 4., 3.],#> [ 4., 3., 2., 1.]])3.2 如何處理數組的缺失值(missing)和無窮大(infinite)值

缺失值可以用np.nan對象表示,np.inf表示無窮大值,下面用二維數組舉例:

# 插入nan變量和inf變量arr2[1,1]=np.nan# not a numberarr2[1,2]=np.inf# infinitearr2#> array([[ 1., 2., 3., 4.],#> [ 3., nan, inf, 6.],#> [ 5., 6., 7., 8.]])# 用-1代替nan值和inf值missing_bool=np.isnan(arr2)|np.isinf(arr2)arr2[missing_bool]=-1arr2#> array([[ 1., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])3.3 如何計算n維數組的平均值,最小值和最大值

# 平均值,最大值,最小值print("Mean value is: ",arr2.mean())print("Max value is: ",arr2.max())print("Min value is: ",arr2.min())#> Mean value is: 3.58333333333#> Max value is: 8.0#> Min value is: -1.0如果要求數組的行或列的最小值,使用np.amin函數

# Row wise and column wise min# 求數組行和列的最小值# axis=0表示列,1表示行print("Column wise minimum: ",np.amin(arr2,axis=0))print("Row wise minimum: ",np.amin(arr2,axis=1))#> Column wise minimum: [ 1. -1. -1. 4.]#> Row wise minimum: [ 1. -1. 5.]對數組的每個元素進行累加,得到一維數組,一維數組的大小與二維數組相同。

# 累加np.cumsum(arr2)#> array([ 1., 3., 6., 10., 13., 12., 11., 17., 22., 28., 35., 43.])

4. 如何從現有的數組定義新數組

如果使用賦值運算符從父數組定義新數組,新數組與父數組共佔同一個內存空間,如果改變新數組的值,那麼父數組也相應的改變。

為了讓新數組與父數組相互獨立,你需要使用copy()函數。所有父數組都使用copy()方法構建新數組。

# Assign portion of arr2 to arr2a. Doesn't really create a new array.# 分配arr2數組給新數組arr2a,下面方法並沒有定新數組arr2a=arr2[:2,:2]arr2a[:1,:1]=100# arr2相應位置也改變了arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])# 賦值arr2數組的一部分給新數組arr2barr2b=arr2[:2,:2].copy()arr2b[:1,:1]=101# arr2沒有改變arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])

5. 多維數組的重構(reshaping)和扁平(flattening)

重構(reshaping)是改變了數組項的排列,即改變了數組的形狀,未改變數組的維數。

扁平(flattening)是對多維數組轉化為一維數組。

# 3x4數組重構為4x3數組arr2.reshape(4,3)#> array([[ 100., 2., 3.],#> [ 4., 3., -1.],#> [ -1., 6., 5.],#> [ 6., 7., 8.]])5.1 flatten()和ravel()的區別

數組的扁平化有兩種常用的方法,flatten()和ravel() 。flatten處理後的數組是父數組的引用,因此新數組的任何變化也會改變父數組,因其未用複製的方式構建數組,內存使用效率高,ravel通過複製的方式構建新數組。

# flatten方法arr2.flatten()#> array([ 100., 2., 3., 4., 3., -1., -1., 6., 5., 6., 7., 8.])# flatten方法b1=arr2.flatten()b1[0]=100# 改變b1的值並未影響arr2arr2#> array([[ 100., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])# ravel方法b2=arr2.ravel()b2[0]=101# 改變b2值,相應的改變了arr2值arr2#> array([[ 101., 2., 3., 4.],#> [ 3., -1., -1., 6.],#> [ 5., 6., 7., 8.]])6. 如何通過numpy生成序列數(sequences),重複數(repetitions)和隨機數(random)

np.arrange函數手動生成指定數目的序列數,與ndarray作用一樣。

# 默認下限為0print(np.arange(5))# 0 to 9,默認步數為1print(np.arange(0,10))# 遞增步數2print(np.arange(0,10,2))# 降序print(np.arange(10,0,-1))#> [0 1 2 3 4]#> [0 1 2 3 4 5 6 7 8 9]#> [0 2 4 6 8]#> [10 9 8 7 6 5 4 3 2 1]上例是通過np.arrange設置初始位置和結束位置來生成序列數,如果我們設置數組的元素個數,那麼可以自動計算數組的遞增值。

如構建1到50的數組,數組有10個元素,使用np.linspace總動計算數組的遞增值。

# 起始位置和結束位置分別為1和50np.linspace(start=1,stop=50,num=10,dtype=int)#> array([ 1, 6, 11, 17, 22, 28, 33, 39, 44, 50])我們注意到上面例子的遞增值並不相等,有5和6兩個值,原因是計算遞增值採用了四捨五入的算法(rounding)。與np.linspace類似,np.logspace以對數尺度的方式增長。

# 設置數組的精度為小數點後兩位np.set_printoptions(precision=2)# 起點為 10^1 and 終點為 10^50,數組元素個數10,以10為底數np.logspace(start=1,stop=50,num=10,base=10)#> array([ 1.00e+01, 2.78e+06, 7.74e+11, 2.15e+17, 5.99e+22,#> 1.67e+28, 4.64e+33, 1.29e+39, 3.59e+44, 1.00e+50])初始化數組的元素全為1或全為0。

np.zeros([2,2])#> array([[ 0., 0.],#> [ 0., 0.]])np.ones([2,2])#> array([[ 1., 1.],#> [ 1., 1.]])7.1 如何構建重複的序列數

np.tile重複整個的數組或列表n次,np.repeat重複數組每一項n次。

a=[1,2,3]# 重複數組a兩次print('Tile: ',np.tile(a,2))# 重複數組a每項兩次print('Repeat: ',np.repeat(a,2))#> Tile: [1 2 3 1 2 3]#> Repeat: [1 1 2 2 3 3]7.2 如何生存隨機數

random模塊包含的函數可以生成任一數組形狀的隨機數和統計分布。

# 生成2行2列的[0,1)的隨機數print(np.random.rand(2,2))# 生成均值為0方差為1的2行2列的正態分布值print(np.random.randn(2,2))# 生成[0,10)的2行2列的隨機整數print(np.random.randint(0,10,size=[2,2]))# 生成一個[0,1)的隨機數print(np.random.random())# 生成[0,1)的2行2列的隨機數print(np.random.random(size=[2,2]))# 從給定的列表等概率抽樣10次print(np.random.choice(['a','e','i','o','u'],size=10))# 從給定的列表和對應的概率分布抽樣10次print(np.random.choice(['a','e','i','o','u'],size=10,p=[0.3,.1,0.1,0.4,0.1]))# picks more o's#> [[ 0.84 0.7 ]#> [ 0.52 0.8 ]]#> [[-0.06 -1.55]#> [ 0.47 -0.04]]#> [[4 0]#> [8 7]]#> 0.08737272424956832#> [[ 0.45 0.78]#> [ 0.03 0.74]]#> ['i' 'a' 'e' 'e' 'a' 'u' 'o' 'e' 'i' 'u']#> ['o' 'a' 'e' 'a' 'a' 'o' 'o' 'o' 'a' 'o']7.3 如何得到數組獨特(unique)的項和個數(counts)

np.unique函數去除數組中重複的元素,設置return_counts參數為True,得到數組每一項的個數。

# 定義範圍為[0,10),個數為10的隨機整數數組np.random.seed(100)arr_rand=np.random.randint(0,10,size=10)print(arr_rand)#> [8 8 3 7 7 0 4 2 5 2]# 得到數組獨特的項和相應的個數uniqs,counts=np.unique(arr_rand,return_counts=True)print("Unique items : ",uniqs)print("Counts : ",counts)#> Unique items : [0 2 3 4 5 7 8]#> Counts : [1 2 1 1 1 2 2]8 小結

本文比較全面的介紹了numpy的基本用法,希望對numpy還不熟悉的同學有所幫助。

相關焦點

  • 清晰易懂的Numpy進階教程
    推薦閱讀:清晰易懂的Numpy入門教程Numpy是數據分析和科學計算的核心包,上文詳細介紹了Numpy的入門教程,本文將詳細介紹Numpy的高級特性,這些特性對於數據分析和處理非常重要。來源:Machine Learning Plus翻譯:石頭目錄1. 如何獲取滿足條設定件的索引2.
  • Numpy入門詳細教程
    >numpy入門詳細教程python數據科學基礎庫主要是三劍客:numpy,pandas以及matplotlib,每個庫都集成了大量的方法接口,配合使用功能強大。平時雖然一直在用,也看過很多教程,但紙上得來終覺淺,還是需要自己系統梳理總結才能印象深刻。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • python數據科學系列:numpy入門詳細教程
    平時雖然一直在用,也看過很多教程,但紙上得來終覺淺,還是需要自己系統梳理總結才能印象深刻。本篇先從numpy開始,對numpy常用的方法進行思維導圖式梳理,多數方法僅拉單列表,部分接口輔以解釋說明及代碼案例。最後分享了個人關於axis和廣播機制的理解。
  • Python 繪圖庫 Matplotlib 入門教程
    本文是對它的一個入門教程。運行環境由於這是一個Python語言的軟體包,因此需要你的機器上首先安裝好Python語言的環境。關於這一點,請自行在網絡上搜索獲取方法。關於如何安裝Matplotlib請參見這裡:Matplotlib Installing。
  • Numpy入門教程:10. 統計相關
    統計相關次序統計numpy.amin(a[, axis=None, out=None, keepdims=np._NoValue, initial=np._NoValue, where=np._NoValue])Return the minimum of an array or minimum along an axis.
  • 大數據分析Python NumPy庫使用教程
    大數據分析Python NumPy庫使用教程為數據工程師提供有關NumPy的從零開始的培訓。這意味著您不需要具有NumPy的任何經驗,也不會浪費任何時間學習與數據工程工作無關的東西。 在瀏覽了基礎知識之後,您將快速開始使用NumPy來構建和操作二維和三維數組。
  • 入門|數據科學初學者必知的NumPy基礎知識
    這篇教程介紹了數據科學初學者需要了解的 NumPy 基礎知識,包括如何創建 NumPy 數組、如何使用 NumPy 中的廣播機制、如何獲取值以及如何操作數組。更重要的是,大家可以通過本文了解到 NumPy 在 Python 列表中的優勢:更簡潔、更快速地讀寫項、更方便、更高效。本教程將使用 Jupyter notebook 作為編輯器。讓我們開始吧!
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 教程中完整代碼已上傳至github上, 可關注我百家號後發送消息"CNN代碼", 獲得地址.前言Numpy是一個非常好用的python科學計算的庫,CNN是現在視覺領域深度學習的基礎之一。
  • GreatPan龜鼓入門教程|4-5-3-6-2-5-1和聲進行彈唱
    用級數來進行標記,會較明顯的看出歌曲的和弦走向,易記易懂,且非常易於轉調,請看下方圖示:我們先以C調(1=C)為例,4級=F,5級=G,3級=E,6級=Am,2級=D,1級=C。轉為D調(1=D)後,4級=G,5級=A,3級=F,6級=Bm,2級=E,1級=D。
  • 教程| Numpy的線性代數運算
    因此,NumPy提供了一個用於矩陣乘法的dot函數(既是一個數組方法也是numpy命名空間中的一個函數):.dot(y)等價於np.dot(x, y):一個二維數組跟一個大小合適的一維數組的矩陣點積運算之後將會得到一個一維數組numpy.linalg中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西
  • Mathematica數學入門教程【6】 - 幾何圖形
  • Keras入門系列教程:兩分鐘構建你的第一個神經網絡模型
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 本系列其餘教程地址見文章末尾.Keras主要用於快速原型設計,高級研究和生產中,具有三個主要優勢:用戶友好的Keras提供一致而簡潔的API, 能夠極大減少一般應用下用戶的工作量,同時,Keras提供清晰和具有實踐意義的bug反饋。
  • Numpy詳細教程
    注意numpy.array和標準Python庫類array.array並不相同,後者只處理一維數組和提供少量功能。更多重要ndarray對象屬性有:ndarray.ndim: 數組軸的個數,在python的世界中,軸的個數被稱作秩ndarray.shape:數組的維度。這是一個指示數組在每個維度上大小的整數元組。
  • 關於機器學習,這可能是目前最全面最無痛的入門路徑和資源!
    而numpy和pandas可以說是處理矩陣的好手,所以通常會用numpy和pandas對數據進行處理後再餵給機器,就我目前的實踐經驗來說,numpy應用的場景會比pandas多些。 其實好一些機器學習框架(如TensorFlow和Mxnet)也有自己處理數據的模塊,但大多是通過封裝numpy得到的,使用的方法也很像,所以無腦去上手numpy肯定不虧。
  • 南方CASS測繪軟體,視頻講解+word版教程,限時打包帶走
    南方CASS測繪軟體,視頻講解+word版教程,限時打包帶走CASS軟體作為市場佔有率非常高的專業測繪工具,已經成為業內應用最廣、使用最方便快捷的軟體品牌,也是用戶量最大、升級最快、服務最好的主流成圖和土石方計算軟體系統。
  • Python學習第117課——numpy中dot的運用舉例
    我們現在入門階段知道有這個概念就行,能解決實際問題就行,後面遇到了問題再去深入。現在我們是為了入門,入門之後,你可以根據自身的底子去選擇發展方向。閒話少敘,我們對numpy中的矩陣相乘做一些舉例說明。我們還是使用上節的兩個矩陣為例。上節我們用手寫推導矩陣相乘過程如下:我們現在用代碼演示一下numpy中的矩陣相乘。
  • 只需三個公式,三階魔方超簡單入門教程1:基本知識和操作
    不過不用擔心,在我這個教程裡面,你只需要記住三個簡單的公式,就可以把整個三階魔方來進行復原。特別適合新手入門,簡單易懂、老少皆宜。在我們正式學習之前呢,我們要先了解一下魔方的各個組成部分。在我的這個教程中,是以白色面為「底面」,與它相對的面,也就是黃色面為「頂面」。簡單地來說,白色面始終在下面,黃色面始終在上面。最後,我們約定一下本教程中的幾個術語。第一個是「撥」,左手的「撥」就是用左手的食指撥一下頂層,讓頂層逆時針轉動90度;同樣的道理,右手的「撥」就是用右手的食指撥一下頂層,讓頂層順時針轉動90度。
  • Python趣味打怪:147段簡單代碼完成從入門到大師
    入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:例子是有趣的例子,教程也是正經教程,學習路徑清晰、系統,先一起來看看完整目錄:
  • PyTorch 深度學習官方入門中文教程 pdf 下載|PyTorchChina
    官方教程包含了 PyTorch 介紹,安裝教程;60分鐘快速入門教程,可以迅速從小白階段完成一個分類器模型;計算機視覺常用模型,方便基於自己的數據進行調整,不再需要從頭開始寫;自然語言處理模型,聊天機器人,文本生成等生動有趣的項目。
  • Python入門教程(二):Numpy數組基礎
    import numpy as npnp.random.seed(0)  # 設置隨機種子數,保證程序執行時每次都可以生成同樣的隨機數組x1 = np.random.randint(10, size=6)  # 一維數組x2 = np.random.randint(10, size=(3, 4))  # 二維數組,創建三行四列的數組