天天看點

Python資料分析(三)Numpy數值計算基礎

作者:熱愛分享網絡安全知識

Numpy(numeric python),是 python 的一個開源數值計算庫,主要用于

數組和矩陣計算。底層是 c 語言實作,運作效率遠高于純 python 代碼。在

python 資料科學領域,numpy 是使用最廣泛的工具包之一。

Numpy 提供了兩種基本的對象:ndarray(N-dimensional Array Object) 和 ufunc

(Universal Function Object)

• ndarray 是存儲單一資料類型的多元數組,包含 array 及其子類 matrix

• ufunc 則是能夠對數組的每一個元素進行處理的函數

安裝:pip install numpy

Python資料分析(三)Numpy數值計算基礎

建立數組對象

Numpy 提供的 array 函數可以建立一維或多元數組,基本使用文法如下:

np.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)

Python資料分析(三)Numpy數值計算基礎

相關屬性

Python資料分析(三)Numpy數值計算基礎

我們也可以通過内置函數來建立數組:

一維

np.arange(start,end,step)

等差數列,固定步長

np.linspace(start,end,num=50)

等差數列,固定個數

np.logspace(start,end,num=50,base=10) 等比數列

np.diag(array,k=0)

抽取對角線

多元

np.zeros(shape)

#用零填

np.zeros_like(a)

#複制a的shape,用零填

np.ones(shape)

#用1填

np.ones_like(a)

#複制a的shape,用1填

np.full(shape, fill_value) #用指定值填

np.identity(n)

#n行的機關矩陣(對角線為1)

np.eye(N, M=None, k=0) #類似上面,但可以指定列,k值對對角線平移

我們還可以使用 random 子產品建立數組:

np.random.random()

:無限制條件下生成随機數組

np.random.rand()

:生成服從均勻分布的随機數組

np.random.randn()

:生成服從正态分布的随機數組

np.random.randint(low, high=None, size=None)

:生成指定區間的随機數組

random 子產品其他常用函數:

Python資料分析(三)Numpy數值計算基礎

數組資料類型

在 numpy 中,所有數組的資料類型是同質的,即數組中的所有元素類型必須是一

緻的。這樣做的好處是,更容易确定該數組所需要的存儲空間。下面是 numpy 的

基本資料類型及其取值範圍

Python資料分析(三)Numpy數值計算基礎
Python資料分析(三)Numpy數值計算基礎

我們知道 python 中 空值記為 None,而在 numpy 中的空值表示為: np.nan ,它是一個特殊的float。

我們也可以自定義資料類型:

建立一個存儲餐飲企業庫存資訊的資料類型。其中,用一個長度為40個字元的字元串來記錄商

品的名稱,用一個64位的整數來記錄商品的庫存數量,最後用一個64位的單精度浮點數來記

錄商品的價格,具體步驟如下。

Python資料分析(三)Numpy數值計算基礎

數組的通路

• 通過索引通路

通路數組的方式 a[m][n]

通路矩陣的方式 a[m,n]

通過整數數組

a[[1,3,4]]

通過布爾數組

a[[True,Flase,True]]

• 通過切片通路

一維數組切片同 python 序列切片一緻,a[start:stop:step]

多元數組切片,每個次元以逗号隔開,a[start:stop:step, start:stop:step]

或者 a[:][:]

數組變形

• reshape

a.reshape(),傳回一個新的數組,原數組 a 不受影響

• resize

a.resize(),傳回 None,修改的是原數組 a

數組扁平化

• ravel

a. ravel(),将多元壓縮為一維,傳回原數組的引用,對新結果修改,a會受影響

• flatten

a. flatten(),将多元壓縮為一維,傳回原數組的拷貝,對新結果修改,a不會受影響

二者均可以指定 order 的值為“

F”從列的方向上壓扁

數組組合

• hstack

np.hstack((arr1,arr2))

數組橫向組合

np.c_[arr1,arr2]

• vstack

np.vstack((arr1,arr2))

數組縱向組合

np.r_[arr1,arr2]

• concatenate

np. concatenate((arr1,arr2),axis=1)

數組橫向組合

np. concatenate((arr1,arr2),axis=0)

數組縱向組合

數組分割

• hsplit

np.hsplit(arr,2)

數組橫向分割

• vsplit

np.vsplit(arr,2)

數組橫向分割

• split

np. split(arr,2,axis=0)

數組縱向分割

np. split(arr,2,axis=1)

數組橫向分割

建立 numpy 矩陣

在NumPy中,矩陣是ndarray的子類,是繼承自NumPy數組對象的二維數組對象。與數

學概念中的矩陣一樣,NumPy中的矩陣也是二維的。

 使用mat函數建立矩陣: matr1 = np.mat("1 2 3;4 5 6;7 8 9")

 使用matrix函數建立矩陣:matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])

差別:使用mat函數建立矩陣時,若輸入matrix或ndarray對象,則不會為它們建立副本

很多時候會根據小的矩陣建立大的矩陣:

 使用bmat函數合成矩陣:np.bmat("arr1 arr2; arr1 arr2"

矩陣的運算

在NumPy中,矩陣計算是針對整個矩陣中的每個元素進行的:

 矩陣與數相乘:matr1*3

 矩陣相加減:matr1±matr2

 矩陣相乘:matr1*matr2

 矩陣對應元素相乘:np.multiply(matr1,matr2)

 矩陣特有屬性:

Python資料分析(三)Numpy數值計算基礎

矩陣的運算(此處以矩陣乘法和轉置為例)

Python資料分析(三)Numpy數值計算基礎

• numpy.linalg 中有一組标準的矩陣分解運算以及諸如求逆和行列式之類的

函數(了解)

Python資料分析(三)Numpy數值計算基礎

通用函數

• ufunc(universal function),全稱通用函數,是一種能夠對數組中所有

元素進行操作的函數

四則運算:加(+)、減(-)、乘(*)、除(/)、幂(**)。數組間的四則運算表示

對每個數組中的元素分别進行四則運算,是以形狀必須相同。

比較運算:>、<、==、>=、<=、!=。比較運算傳回的結果是一個布爾數組,每個

元素為每個數組對應元素的比較結果。

邏輯運算:np.any函數表示邏輯“or”,np.all函數表示邏輯“and”。運算結果傳回

布爾值。

• 四則運算

Python資料分析(三)Numpy數值計算基礎

• 标量運算,會作用到整個數組上

Python資料分析(三)Numpy數值計算基礎

• 比較運算

Python資料分析(三)Numpy數值計算基礎

廣播機制

廣播(Broadcasting)是指不同形狀的數組之間執行算術運算的方式。當使

用ufunc函數進行數組計算時,ufunc函數會對兩個數組的對應元素進行計算。

進行這種計算的前提是兩個數組的shape一緻。若兩個數組的shape不一緻,

則NumPy會實行廣播機制。

廣播的條件:待擴充的軸的長度為 1 時

次元擴張和維數擴張:向最大值靠攏

Python資料分析(三)Numpy數值計算基礎

讀寫檔案

讀寫二進制資料

 save 函數是以二進制的格式儲存資料。

np.save("../tmp/save_arr",arr)

 savez 函數可以将多個數組儲存到一個檔案中。

np.savez('../tmp/savez_arr',arr1,arr2)

 load 函數是從二進制的檔案中讀取資料。

np.load("../tmp/save_arr.npy")

注意:存儲時可以省略擴充名,但讀取時不能省略擴充名。

讀寫文本檔案

 savetxt 函數是将數組寫到某種分隔符隔開的文本檔案中。

np.savetxt("../tmp/arr.txt", arr, fmt="%d", delimiter=",")

 loadtxt 函數執行的是把檔案加載到一個二維數組中。

np.loadtxt("../tmp/arr.txt",delimiter=",")

 genfromtxt 函數面向的是結構化數組和缺失資料。

np.genfromtxt("../tmp/arr.txt", delimiter = ",")

排序

• 直接排序

np.sort(arr, axis=-1, kind=None, order=None)

axis 可指定排序的方向,0 縱向,1 橫向

kind 可指定排序的算法,預設快排

也可使用 arr.sort() 來排序

Python資料分析(三)Numpy數值計算基礎

• 間接排序

np.argsort(arr, axis=-1, kind=None, order=None) 或 arr.argsort()

 傳回值為重新排序值的下标

np.lexsort(keys, axis=-1) ,用法: np.lexsort((a,b,c))

 按最後傳入的數組排序

去重與重複

• 去重

• np.unique(arr)

• 重複

np.tile(arr,arr)

arr.repeat(3,axis=1)

tile 和 repeat 差別:tile 是對數組進行重複操作,repeat 是對數組中的每個元素進行

重複操作前者是函數,後者是方法。

常用統計函數

當 axis=0 時,表示沿着縱軸計算。當 axis=1時,表示沿着橫軸計算。預設計算一個總值。

Python資料分析(三)Numpy數值計算基礎

常用統計函數

• 案例:随機漫步

Python資料分析(三)Numpy數值計算基礎
Python資料分析(三)Numpy數值計算基礎

在學習完以上内容後還要多加練習!